欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

[工具推荐】串行调试工具--UartAssit

最编程 2024-04-07 12:58:25
...

视频演示:http://mpvideo.qpic.cn/0bf2uyaamaaajaae4pjyrzqvbjwda2taabqa.f10002.mp4?

UartAssit串口调试助手,广泛应用于工控领域的数据监控、数据采集、数据分析等工作,可以帮助串口应用设计、开发、测试人员检查所开发的串口应用软硬件的数据收发状况,提高开发的速度,成为您的串口应用的开发助手。野人家园UartAssist串口调试助手是绿色软件,只有一个执行文件,适用于各版本Windows操作系统,不需要dotNetFramework框架支持。可以在一台PC上同时启动多个串口调试助手(使用不同的COM口)。典型应用场合:通过串口调试助手与自行开发的串口程序或者串口设备进行通信联调。支持多串口,自动监测枚举本地可用串口;*设置串口号、波特率、校验位、数据位和停止位等(支持自定义非标准波特率);支持对串口DCD、DTR、DSR、RTS等针脚状态位的检测控制。支持ASCII/Hex两种模式的数据收发,发送和接收的数据可以在16进制和AscII码之间任意转换;可以自动发送校验位,支持多种校验格式;支持发送的数据中嵌入脚本代码以实现动态数据发送;支持建立自动应答规则,实现指令自动应答/回复功能;支持间隔发送,循环发送,批处理发送,输入数据可以从外部文件导入;可以保存预定义指令/数据序列,任何时候都可以通过工具面板发送预定义的指令或数据,便于通信联调。软件界面支持中/英文(通过菜单选项选择切换),默认自适应操作系统的语言环境。

【软件特色】 1. 绿色软件、只有一个执行文件、无需安装; 2. 支持中英文双语言,自动根据操作系统环境选择系统语言类型; 3. 支持常用的各种波特率,端口号、校验位、数据位和停止位均可设置;

4. 支持软/硬件多种流控方式;

5. 自动检测枚举本机串口号,支持虚拟串口; 6. 支持设置分包参数(最大包长、分包时间),防止接收时数据粘包。 7. 支持ASCII/Hex发送,发送和接收的数据可以在16进制和AscII码之间任意转换,支持发送和显示汉字; 8. 可以自动发送校验位,支持多种校验格式,如校验和、异或、CRC16、固定字节等; 9. 支持AT指令自动添加回车换行选项,启用该选项时,在发送AT指定时会自动在行尾补全回车换行; 10. 发送内容支持转义字符,例如发送框中包含诸如\r\n等转义符时,会自动解析成对应的ASCII码进行发送; 11. 支持动态脚本代码发送,可以在发送的文本数据中嵌入C语言脚本代码,实现动态数据发送; 12.接收数据可以自动保存到文件,并支持数据文件和日志文件两种选项; 13.支持日志接收模式:接收内容时自动显示时间戳等相关信息; 14.支持任意间隔发送,循环发送; 15.可以从文件导入数据用于发送; 16.接收和发送文字支持ANSI与UTF8两种编码方式; 17.支持预定义/快捷指令,通过按键或者自定义快捷键进行发送; 18.支持预定义并存储批量数据或指令序列,可设置每条指令的发送延迟,并可按设定顺序及延迟时间依次批量发送; 19.支持自动应答功能,通过建立自动应答规则实现指令自动应答; 20.自动保存历史发送记录,可以调出历史记录发送历史数据; 21.集成部标808协议客户端模拟器,支持JT/T808-2019及JT/T808-2013协议; 22.集成Modbus协议指令模拟器,支持RTU、ASCII、TCP三种协议; 23.集成IEEE754浮点数据格式转换器; 24.支持界面窗口的背景以及字体定制; 25.可定制发送框默认内容。

下载地址:

http://free.cmsoft.cn/download/cmsoft/assistant/uartassist5.0.2.zip

类似工具推荐:可以直接下载应用商城的串口调试助手.

视频演示:http://mpvideo.qpic.cn/0bf2xaaamaaawmae3rbyrzqvbogda24aabqa.f10002.mp4?

一般调试的话,内容可以不用看了.

UartAssit转义符及指令帮助

1. 发送转义字符

以ASCII码字符串方式发送数据时,允许用户在字符串中使用转义字符的方式插入非打印字符。最简单的例子,发送一条带回车换行结尾的AT指令,只要在发送框输入 AT\r\n,然后直接点击发送按钮即可。

目前,调试助手支持如下这些C语言标准转义字符:

转义字符

含义

\r

回车符,等价十六进制 \x0D

\n

换行符,等价十六进制 \x0A

\t

水平制表符(HT),等价十六进制 \x09

\v

垂直制表符(VT),等价十六进制 \x0B

\a

响铃(BEL),等价十六进制 \x07

\b

退格符(BS),等价十六进制 \x08

\f

换页符(FF),等价十六进制 \x0C

\xhh

2位十六进制转义字符

\ddd

3位八进制转义字符

作为扩展,调试助手支持转义十六进制数组,例如:\xA0\x12\xF1\xAB\xCD\x51\xF3

等价于 \x[A0 12 F1 AB CD 51 F3] 。包含在中括号[]中的多个16进制字节之间可以使用若干空格符分割或没有空格。

注意:使用转义符时,必须勾选主界面左侧发送设置中的【自动解析转义符】选项,否则调试助手不会对转义符进行任何解析处理。

2. 发送指令脚本

通过转义符扩展,调试助手在V5.0.2版本之后开始支持发送指令脚本,允许用户在发送的指令数据中,加入各种业务处理逻辑,嵌入包含函数以及计算表达式的脚本代码,动态计算生成最终用于发送的数据内容。处于调试目的,用户还可以在发送的指令中调用printf函数进行调试打印,调试输出结果会显示在日志窗口。

下面这个例子,通过调试助手发送一条Modbus指令。在调试助手的发送窗口输入以下内容:\x[01 04 00 00 00 04]\[2:reverse(calculate(0,-1,ALGO_CRC16_MODBUS))]

这条指令表示发送一组长度为6字节的十六进制数据01 04 00 00 00 04,后面跟2字节的CRC16校验码,这个校验码通过以下代码动态计算获得:

\[2:reverse(calculate(0,-1,ALGO_CRC16_MODBUS))]

其中,\[]称为模式符,用作嵌入脚本代码的容器。上述表达式通过冒号分割成两部分,冒号前的2表示最终计算值只取2字节,冒号后的表达式用于计算校验码。表达式中的calculate是系统内置函数,用于计算校验算法,calculate函数的第1个参数表示从当前发送数据的第几个字节开始计算校验码;第2个参数表示校验数据长度,此长度可以负数,比如为-1时,表示数据长度截止到当前calculate函数调用位置的前一个字节数据,-2则表示数据长度从当前位置往前推2个字节,以此类推;calculate函数的第3个参数表示使用的算法,ALGO_CRC16_MODBUS是系统内置常数,表示MODBUS_CRC16校验算法。函数reverse用于将目标数据的字节顺序进行逆转(高低字节交换重排)。这里调用reverse的目的是因为calculate函数计算出的16位CRC校验码是网络字节顺序(BigEndian),但是ModbusRTU协议中的CRC校验码要求使用LittleEndian字序,所以这里要进行字节顺序反转处理。

图1 发送包含函数表达式的指令脚本

发送脚本代码时,必须勾选发送设置中的【ASCII】模式以及【转义字符指令解析】这两个选项。这是因为,只有选择【ASCII】才允许输入脚本代码,否则若选择HEX模式,那么就只能输入十六进制数字;并且必须勾选【转义字符指令解析】选项后,调试助手才会对通过反斜杠导入的脚本表达式进行解析。

指令中嵌入脚本代码必须使用模式符\[]。具体的嵌入方式有两种:运算表达式和BLOCK代码块(参考第4及第5小节)。

3. 脚本运算符

自动应答规则引擎,支持各种逻辑运算及位操作符。一共有34种运算符,10种运算类型:算术运算符(+、-、*、/、%)、关系运算符(>、>=、==、!=、<、<=)、位运算符(>>、<<、==、!=、<、<=)、逻辑运算符(!、||、&&)、条件运算符、(?:)指针运算符(&、*)、赋值运算符(=)、逗号运算符(,)、求字节运算符(sizeof)、强制类型转换运算符((类型名))、其他(下标[]、分量、函数);若按参与运算的对象个数,运算符可分为单目运算符(如!)、双目运算符(如+、-)和三目运算符(如?:)。指令模板中实际常用的运算符,如下表所示:

优先级

运算符

名称或含义

使用形式

说明

1

()

圆括号

圆括号

(表达式)、函数名(形参表)

圆括号

2

(类型)

强制类型转换

(数据类型)表达式

-

负号运算符

-表达式

单目运算符

!

逻辑非运算符

!表达式

单目运算符

~

按位取反运算符

单目运算符

3

/

表达式 / 表达式

双目运算符

*

表达式*表达式

双目运算符

%

余数(取模)

整型表达式%整型表达式

双目运算符

4

+

表达式+表达式

双目运算符

-

表达式-表达式

双目运算符

`5

<<

左移

变量<<表达式

双目运算符

>>

右移

变量>>表达式

双目运算符

6

>

大于

表达式>表达式

双目运算符

>=

大于等于

表达式>=表达式

双目运算符

<

小于

表达式<表达式

双目运算符

<=

小于等于

表达式<=表达式

双目运算符

7

==

等于

表达式==表达式

双目运算符

!=

不等于

表达式!=表达式

双目运算符

8

&

按位与

表达式&表达式

双目运算符

9

^

按位异或

表达式^表达式

双目运算符

10

|

按位或

表达式|表达式

双目运算符

11

&&

逻辑与

表达式&&表达式

双目运算符

12

||

逻辑或

表达式||表达式

双目运算符

13

?:

条件运算符

表达式1? 表达式2:表达式3

三目运算符

4. 运算表达式

这里的运算表达式,特指具有返回值的基于类C语言语法规则的计算表达式。其一般形式为: \[n:expression#remark]

这是一种三段式表示法:第1段是输出数据长度,第2段是计算表达式,第3段是注解(注释)文字。其中第1段和第3段都可以省略,最简形式为 \[expression]。

如果设置的输出长度(n)大于实际计算表达式(expression)的最终计算值的长度,则用0补足后输出,反之若设置的输出长度小于最终计算结果的长度,则截掉高位多余字节后输出。如果省略第1段的长度值,则按表达式计算结果的固有长度输出。注解字段为可选字段,以#号开头,表示注释性文字,也可以作为主解名被引用。。

例如:

 \[2: 2*(getuchar(0)+getuchar(1))]

 \[(getuchar(#len)+1): 2*(getuchar(0)+getuchar(1))]

运算表达式经过解析后会时动态地被最终计算值所替换。因此,运算表达式在形式上必须是一条具有返回值的脚本语句构成,而不允许分多条语句实现。如果一条语句无法实现,只能通过下一节所介绍的包含多条脚本语句的BLOCK代码段实现。BLOCK代码块的返回值通过return语句或者echo/echob函数实现传递。

5. BLOCK代码块

自动应答规则的指令模板,可以要使用包含多条语句的BLOCK语法。一个BLOCK的多条语句通过大括号对{}包括起来,多条语句之间用分号隔开,最终通过return语句,或者echo函数返回BLOCK表达式的最终值。不同的是,return返回值后就会终止当前BLOCK后面的语句,而echo返回值之后会继续执行BLOCK后面的语句。如果一个BLOCK中执行了多次echo,则每次返回的数据会追加到之前返回数据的后面。如果没有执行到echo或return,则表示无返回数据;如果既有echo值,又有return值,则echo值会忽略而只取return值。

例如,下面这个BLOCK例子:

\[{

int num=getuchar(#num);

if(num>0){

echo(0xF2F1);

echo("\xF3\xF4%x",num);

}

else return 0;

}]

代码说明:若if(num>0)表达式成立,则调用两次echo,两次数据叠加,最终返回16进制数据流F1 F2 F3 F4 num;若if(num>0)表达式不成立,则返回数值0。

作为扩展,应答规则中脚本代码支持0x开头的16进制立即数,如上面代码中的0xF2F1就是一个16进制立即数。

通常,运算表达式都可以转换成BLOCK代码块。例如,下面这个运算表达式:

[reverse(calculate(0,-1,ALGO_CRC16_MODBUS))]

虽然调用了多个函数,多个参数,但是只有仅仅1条语句(1个表达式),并有1个返回值,属于运算表达式,可以进一步改写成以下的块级代码段:

\[{

short crc16=calculate(0,-1,ALGO_CRC16_MODBUS);

crc16=reverse(crc16);

return crc16; //或者echo(crc16);

}]

6. 变量数据类型

自动应答规则引擎的内置脚本代码只能使用下表所示的基本数据类型,不支持用户自定义变量结构体。目前所支持的基本数据类型如下:

类型名

可用别名

类型说明

char

有符号字符

unsigned char

byte或uchar

无符号字符

short

有符号短整形

unsigned short

ushort

无符号短整形

int

有符号整形(32位)

unsigned int

uint

无符号整形(32位)

float

32位浮点数

bool

布尔类型

string

字符串类型

使用限制:仅支持一维数组和一维指针,暂不支持多维数组和多维指针;暂不支持64位数据类型。

7. 变量定义及作用域

自动应答规则的脚本语言支持使用变量。根据变量的强弱类型可划分为,强类型变量和弱类型变量;根据变量作用域,则可分为局部变量及全局变量。

7.1强类型变量与弱类型变量

(1) 强类型变量。强类型变量类似于标准c语言的变量定义方式,必须先定义后使用。强类型变量的数据类型在变量定义时就被指定,不允许动态修改变量类型。强类型变量定义时,需要指定变量的数据类型以及变量名,并且允许在变量定义时初始化赋值。如:

\[{ int x,y; //定义两个强类型的整形变量

int z=100; //定义一个初值为100的强类型整形变量

char *str1="abc";//定义一个null-teminated字符串

string str2="abc\x00\x01\x02";//定义一个标准字符串,允许包含0。

}]

(2) 弱类型变量。弱类型变量无需声明或定义,也不用指定变量的数据类型,可以直接使用。给弱类型变量赋值时,如果变量名不存在则会自动创建该变量。弱类型变量的数据类型总是等于最后一次赋值的数据类型。也就是说,弱类型变量的数据类型是可以被动态修改的。弱类型变量必须通过保留字global按数组索引的方式来使用,数组的下标为字符串形式的变量名。例如:

\[ {

global["x"]=100; //给弱类型全局变量x赋值整形数100。

global["x"]="abcdefg"; //给弱类型全局变量x赋值字符串。

}]

7.2局部变量与全局变量

自动应答规则中的变量,如果是强类型方式定义的,只能作为局部变量,仅在当前指令模板的当前\[]段内有效。多个\[]内的同名局部变量互不影响。

如果需要使用全局变量,就必须使用global["name"]形式的弱类型变量。弱类型变量的作用域覆盖所有指令模板,在调试助手整个运行期间都常驻保留在内存中。

弱类型全局变量一旦初始化赋值后,就可以省略global关键字,而直接通过变量名访问,就跟操作强类型变量一样。仅当需要修改变量数据类型时,才必须通过global关键字来给变量赋值。

8. 变量强制类型转换

跟标准的C/C++语法规则一样,当操作数的类型不同,经常需要将操作数转化为所需要的类型,这个过程即为强制类型转换。

8.1强制类型转换的形式

变量强制类型转换具有两种形式:显式强制类型转换和隐式强制类型转换。下面就两种形式分别进行简单的描述。

(1) 显式强制类型转换

显式强制类型转换很简单,格式为: TYPE b = (TYPE) a;

其中,TYPE为类型描述符,如int,float等。经强制类型转换运算符运算后,返回一个具有TYPE类型的数值,这种强制类型转换操作并不改变操作数本身,运算后操作数本身未改变,例如:

int n=0xab65;

char a=(char)n;

上述强制类型转换的结果是将整型值0xab65的高端一个字节删掉,将低端一个字节的内容作为char型数值赋值给变量a,而经过类型转换后n的值并未改变。

(2)隐式强制类型转换

隐式类型转换发生在赋值表达式和有返回值的函数调用表达式中。在赋值表达式中,如果赋值符左右两侧的操作数类型不同,则将赋值符右边操作数强制转换为赋值符左侧的类型数值后,赋值给赋值符左侧的变量。在函数调用时,如果return后面表达式的类型与函数返回值类型不同,则在返回值时将return后面表达式的数值强制转换为函数返回值类型后,再将值返回,如:

int n;

double d=3.88;

n=d;//执行本句后,n的值为3,而d的值仍是3.88。

8.2强制类型转换在自动应答规则中的典型用途

在指令应答模板中的模式应答数据段,如果不显式指定数据长度,则默认长度为其数据类型的固有长度。

比如,有一个整形数据段,默认长度为4字节。如要要求只取2个字节。可以显示指定数据长度为2,或者强制类型转换为short类型。例如,以下两个指令应答模板等价:

\[2:getshort(0)*100] //#直接指定数据长度2

\[(short)(getU16(0)*100)] //#强制类型转成2字节的short数据类型

注:数值计算表达式的返回值,如果不做强制类型转化,则默认数据类型是32位的int或者float类型,长度4字节。

9. 语法大小写规则

调试助手内置脚本代码是不区分大小写的。但是为避免混乱,推荐大家始终坚持“大小写敏感”的代码书写规范,尽量保证函数名、变量名、常数名等大小写前后书写一致。

10. 字段注解的定义及引用

不管是脚本指令还是指令模板(包括指令匹配模板及指令应答模板)都可以包含若干个模式段,每个模式段的一般形式都可以归结为:

\[exp_len:exp_value#comment]

其中,exp_len为字段数据长度、exp_value为字段数据内容、#comment为字段注解。注解的形式为#号开头加注解文字。注解字段的作用有两个:

(1)起注释作用,对目标字段作解释说明。

(2) 给字段命名,经过命名的字段数据可以被同一个指令模板的其他模式段通过注解名引用。引用注解只能通过以下这几个用于读取指令数据段的系统函数: gets、getchar、getuchar、getshort、getushort、getint、getuint。除此之外,其他函数都不支持调用注解作为参数。

下面举个简单例子作说明:

 指令匹配模板:REQ\[2 #command]

 指令应答模板: ACK\[2:gets(#command,2)]

本例指令匹配模板中,\[2 #command]定长模糊匹配2个字节的command数据;而在应答模板中需要复制这两个字节内容作为应答数据帧的一部分。在应答模板对应的模式应答段中,通过gets(#comment,len)函数可以读取注解名对应的数据块,省略gets的第二个参数表示读取整个目标字段。本例中,应答模板需要复制请求指令中整个command段的数据,因此可以省略gets函数的第2个表示长度的参数。这样,此应答模板可以简化为:

 指令应答模板简化: ACK\[2:gets(#command)]

如果模式应答段需要的数据长度跟gets返回的数据块长度一致,就可以省略模式应答段的长度参数,如下所示:

 指令应答模板再简化: ACK\[gets(#command)]

11. 内建系统函数详解

自动应答规则的运算表达式,可以调用规则引擎内建的系统函数(函数名不区分大小写),目前支持的函数如下。

(1)printf - 格式化输出到控制台

函数原型: void printf(const char format, 可选参数...);

功能描述:按指定格式向标准输出设备(日志/接收窗口)输出调试打印信息。

(2)sprintf - 格式化字符串

函数原型: int sprintf(char *buffer, char *format [,argument,...]);

功能描述: 把格式化的数据写入某个字符串缓冲区。如果成功,则返回写入的字符总数,不包括字符串追加在字符串末尾的空字符。如果失败,则返回一个负数。

(3)strtoint - 字符串转整形数

函数原型: int strtoint(const char *nptr);

函数别名: atoi

功能描述:strtoint函数会扫描参数 nptr字符串,跳过前面的空白字符(例如空格,tab缩进)等,扫描直至下一个非数字字符或到达输入的结尾。如果 nptr不能转换成整数,那么将返回 0。

(4)inttostr - 整形数转字符串

函数原型: string inttostr(int n);

功能描述:将整形数n转换成字符串类型返回。

(5)strcpy - 字符串拷贝

函数原型: char *strcpy(char* dest, const char *src);

功能描述:把src指向的null-terminated字符串复制到dest指向的地址空间,并返回指向dest的指针。

(6)strcat - 字符串拼接

函数原型: char *strcat(char *dest,const char *src1, const char *src2,…);

功能描述:把若干个NULL结尾的源字符串(src1、src2、…)复制拼接到dest所指向的字符串后面(删除dest原来末尾的“\0”)。要保证dest指向的字符串空间足够长,以容纳被复制进来的源字符串。最后返回指向dest的指针。

(7)strcmp - 字符串比较(区分大小写)

函数原型: int strcmp(const char *s1,const char *s2);

功能描述:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符(区分大小写),或遇'\0'为止。当s1<s2时,返回为负数;当s1=s2时,返回值= 0;当s1>s2时,返回正数。

(8)stricmp - 字符串的比较(不区分大小写)

函数原型: int stricmp(const char *s1,const char *s2);

功能描述:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符(不区分大小写),或遇'\0'为止。当s1<s2时,返回为负数;当s1=s2时,返回值= 0;当s1>s2时,返回正数。

(9)strncpy - 限定长度的字符串拷贝

函数原型: char *strncpy(char* dest, const char *src, int n);

功能描述:把src指向的null-terminated字符串复制到dest指向的地址空间,并返回指向dest的指针。如果源字符串实际长度大于参数n,则最多复制n个字节。

(10)strncmp - 限定长度的字符串比较(区分大小写)

函数原型: int strncmp(const char *s1,const char *s2,int n);

功能描述:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符(区分大小写),或遇'\0',或比较字符数超过n为止。当s1<s2时,返回为负数;当s1=s2时,返回值= 0;当s1>s2时,返回正数。

(11)strnicmp - 限定长度的字符串比较(不区分大小写)

函数原型: int strnicmp(const char *s1,const char *s2,int n);

功能描述:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符(不区分大小写),或遇'\0',或比较字符数超过n为止。当s1<s2时,返回为负数;当s1=s2时,返回值= 0;当s1>s2时,返回正数。

(12)memcpy - 内存数据复制

函数原型: void *memcpy(void *dest, void *src, int n);

功能描述:从存储区 src 复制 n 个字节到存储区 dest。返回指向目标存储区 dest的指针。

(13)memcmp - 内存数据比较

函数原型: int memcmp(const void *data1, const void *data2, int n);

功能描述:把存储区 data1 和存储区 data2 的前 n 个字节进行比较。如果返回值 == 0,则表示 data1 等于 data2;如果返回值 < 0,则表示 data1 小于 data2;如果返回值 > 0,则表示 data2 小于 data1。

(14)string - 标准字符串构造方法

 函数原型1: string string(int len);

功能:构造并返回一个预留空间长度为len的空字符串。

 函数原型2: string string(void *str, int len);

功能:构造一个长度为len的空字符串,并用str指向的数据进行初始化。

 函数原型3: string string(string1,string2, …);

功能:将若干个string或char *类型的字符串依次首尾连接起来,构造出一个新字符串返回。

(15)unix_timestamp - 获取32位unix时间戳

函数原型: unsigned int unix_timestamp(void);

入口参数: 无

返 回 值: 返回32位无符号整数。

功能描述:生成32位unix时间戳,即从1970-1-1 00:00:00到当前的秒数。

(16)genAutoID - 生成32位自增流水ID

函数原型: unsigned int genAutoID(void);

入口参数: 无

返 回 值: 返回32位无符号整数。

功能描述:初始值为1,每调用一次,返回值自动加1。

(17)random - 生成随机数/随机选择集合数据

函数原型1: int random (int maximum);

功能描述: 生成一个绝对值小于入参maximum的32位随机数。如果不指定上限(省略maximum参数),则随机生成1个32位随机数。

函数原型2: var random (var1,var2,…);

入口参数: 二个以上任意类型数据

返 回 值: 随机返回入口参数列表中的一个。

功能描述:随机选择集合数据,即从多个数据中随机选择一个数据返回。

例如:random(100,0x255,123.456, 'x',"abcdefg"),实现从入口参数列表中随机返回一个数据,入口参数的数据类型可以*混合,返回值类型就是随机选择参数的实际数据类型。

(18)reverse逆转数据的字节顺序

函数原型: var reverse(data, maxLen);

入口参数: 参数data为待逆序的源数据,可以是整形(短整形或长整形)或浮点等基本数据类型,也可以是字节型数组、字符串或数据指针类型;可选参数maxLen用于指定数据转换的最大长度,如果省略该参数则转换长度取源数据data的默认长度值,如int类型数据默认长度4字节,short类型默认2字节,字符串则自动获取字符串自身长度,等等。

功能描述:将源数据data的字节顺序高低逆转后返回逆序重排的数据。如果源数据类型是整形(短整形或长整形)或浮点等基本数据类型,则不会修改源数据的字节顺序,而是返回逆序后的数据;如果源数据类型是字符串、数组或指针类型,则源数据也会发生字序逆转,并返回逆序后的数据引用。

(19)gets - 从当前指令数据中复制数据段

函数原型: var gets(offset|#comment,len);

入口参数: offset|#comment为偏移地址或者字段注解名。如果是通过偏移地址复制数据,则需要明确这个偏移地址是相对当前模板对应的指令数据;如果通过字段注解名复制数据,则系统会优先查找源指令帧对应的注解字段,如果不存在则再查找应答指令帧对应注解字段,并且引用的目标注解名必须确保在当前模板中调用gets函数前已经定义过。

功能描述:从指定位置(当前指令帧offset偏移地址,或者模板字段注解名对应的指令数据段)处,拷贝指定长度为len的数据块;长度参数len可以省略,如果使用偏移地址拷贝,则省略长度参数时将拷贝数据直至指令帧末尾;如果使用字段名注解,则省略长度参数时表示拷贝注解名对应的整个字段的数据。

例如,以下这条应答规则:

指令匹配模板:ABCD\[2#command]

指令应答模板: ACK_[4:gets(0)]_\[2:gets(#command)]

假定,自动应答规则引擎收到字符串数据 ABCDFF,则指令匹配成功,其中定长模糊匹配\[2#command]所匹配的内容是FF。根据指令应答模板,生成应答数据为: ACK_ABCD_FF。其中,\[4:gets(0)]表示从当前收到的数据报文(ABCDFF)的偏移地址0开始拷贝4个字节数据:ABCD;\[2:gets(#command)]表示从当前收到的数据报文(ABCDFF)的注解#command所匹配对应的偏移地址处拷贝2个字节数据:FF。

(20)getchar - 从当前指令数据中复制一个字节有符号数

函数原型: char getchar(offset|#comment);

函数别名:getS8

入口参数: 指令帧偏移地址或者模板字段注解名(参考前文gets函数的参数说明)。

功能描述:从指定位置(当前指令帧offset偏移地址,或者模板字段注解名对应的指令数据段处)拷贝1个字节的有符号数据。

(21)getuchar - 从当前指令数据中复制一个字节无符号数

函数原型: unsigned char getuchar(offset|#comment);

函数别名:getU8、getByte

入口参数: 指令帧偏移地址或者模板字段注解名(参考前文gets函数的参数说明)。

功能描述:从指定位置(当前指令帧offset偏移地址,或者模板字段注解名对应的指令数据段处)拷贝1个字节的无符号数据。

(22)getshort - 从当前指令数据中复制2个字节有符号整数

函数原型: short getshort(offset|#comment,isBigEndian);

函数别名:getS16

入口参数: offset|#comment为偏移地址或者字段注解名;isBigEndian为可选参数,布尔型数据变量,表示指定读取数据的字节顺序是高字节在前还是在后。为true表示高字节在前否则低字节在前。如果省略isBigEndian参数,表示取全局的字节顺序设置(自动应答设置窗口面板右下方的“网络字序”复选框,用于设置全局的默认字节顺序,勾选表示全局字序为BigEndian,否则为LittleEndian)。

功能描述:从指定位置(当前指令帧offset偏移地址处,或者模板字段注解名对应的指令数据段)拷贝2个字节的有符号整数。

(23)getushort - 从当前指令数据中复制2个字节无符号整数

函数原型: unsigned short getushort(offset|#comment, isBigEndian);

函数别名:getU16

入口参数: offset|#comment为偏移地址或者字段注解名;isBigEndian为可选参数,布尔型数据变量,表示指定读取数据的字节顺序是高字节在前还是在后。为true表示高字节在前否则低字节在前。如果省略isBigEndian参数,表示取全局的字节顺序设置。

功能描述:从指定位置(当前指令帧offset偏移地址,或者模板字段注解名对应的指令数据段处)拷贝2个字节的无符号整数。

(24)getint - 从当前指令数据中复制4个字节有符号整数

函数原型: short getint(offset|#comment, isBigEndian);

函数别名:getS32

入口参数: offset|#comment为偏移地址或者字段注解名;isBigEndian为可选参数,布尔型数据变量,表示指定读取数据的字节顺序是高字节在前还是在后。为true表示高字节在前否则低字节在前。如果省略isBigEndian参数,表示取全局的字节顺序设置。

功能描述:从指定位置(当前指令帧offset偏移地址,或者模板字段注解名对应的指令数据段处)拷贝4个字节的有符号整数。

(25)getuint - 从当前指令数据中复制4个字节无符号整数

函数原型: unsigned short getuint(offset|#comment, isBigEndian);

函数别名:getU32

入口参数: offset|#comment为偏移地址或者字段注解名;isBigEndian为可选参数,布尔型数据变量,表示指定读取数据的字节顺序是高字节在前还是在后。为true表示高字节在前否则低字节在前。如果省略isBigEndian参数,表示取全局的字节顺序设置。

功能描述:从指定位置(当前指令帧offset偏移地址,或者模板字段注解名对应的指令数据段处)拷贝4个字节的无符号整数。

(26)calculate - 计算校验位

函数原型: var calculate(offset, len, algorithm);

入口参数:参数offset为待校验数据偏移地址;len为待校验数据长度,如果len为-1,表示数据长度截止到当前calculate函数调用位置的前一个字节数据,len为-2则表示数据长度从当前位置往前推2个字节,以此类推;参数algorithm为选择的算法。

功能描述:计算数据校验值。函数返回值的数据类型根据具体的校验算法而定。如果校验值是单字节的,则返回的数据类型是unsigned char,如果校验值是双字节的,则返回值的数据类型是unsigned short;如果校验值是四字节的,则返回值数据类型是unsigned int。

目前calculate支持的算法(参数algorithm可取常量值)列表如下:

 ALGO_ACC //1字节累加和

 ALGO_LRC //1字节累加和再取负

 ALGO_XOR //1字节异或校验

 ALGO_CRC16_MODBUS //2字节MODUBUS CRC16校验

 ALGO_CRC8

 ALGO_CRC8_ITU

 ALGO_CRC8_ROHC

 ALGO_CRC8_MAXIM

 ALGO_CRC8_WCDMA

 ALGO_CRC8_CDMA2000

 ALGO_CRC16_CCITT

 ALGO_CRC16_CCITT_FALSE

 ALGO_CRC16_XMODEM

 ALGO_CRC16_X25

 ALGO_CRC16_IBM

 ALGO_CRC16_USB

 ALGO_CRC16_MAXIM

 ALGO_CRC16_DNP

 ALGO_CRC32

 ALGO_CRC32_BZIP2

 ALGO_CRC32_MPEG2

 ALGO_CRC32_POSIX

 ALGO_CRC32_JAMCRC

(27)echo –实现BLOCK代码块的流式返回值

函数原型: int echo (const char *format,…);

功能描述:格式化输出的文本数据作为BLOCK代码块的最终返回值,而echo函数本身将返回所生成文本数据的长度。

例如:

\[{ echo("hello\r\n"); echo("ok\r\n") }]

\[{ echo("ERR=%d",errno); }]

\[{ echo (gets(#Annotation)); }]

注,echo的第二个参数可以省略。当只有1个参数时,不做格式化处理,直接输出第一个参数指向的数据。形式为\[{…}]的BLOCK代码块,可以通过return语句或者echo函数来实现整个BLOCK的返回值。不同的是return语句执行后就会立即退出当前BLOCK,不会再执行当前BLOCK的后续代码;而echo语句则不会退出BLOCK,后续如果有多个echo函数输出数据,这些数据会流式拼接在一起作为当前BLOCK的返回值。

(28)echob – 实现BLOCK代码块的流式返值

函数原型: void echob (data,length);

入口参数: data为输出的数据内容(可以是整形数或字符串或数组或数据指针等);length为限定输出数据的字节长度。

功能描述:输出二进制数据作为BLOCK代码块的返回值。同一个BLOCK内的多个echo或echob函数的输出会按流式数据的方式依次追加合并。

例如:

\[{ echob(gets(0),100)); }]

\[{ echob(gets(#Annotation)); }]

\[{ char str[3]="\x01\x02\x03"; echob(str,3); }]

注, echob的第二个参数可以省略。当只有1个参数时,echo和echob这两个函数等价,按输入数据的固有长度输出。

(29)delay – 延迟操作

函数原型: void delay(ms);

入口参数: ms为延迟的毫秒数。

功能描述:这个函数主要用于应答模板,实现延迟应答。

例如以下应答模板:

\[{delay(1000); echob(gets(0),100));}]

\[{delay(500);}]OK\r\n

通过在应答模板头部插入delay函数,实现应答数据的延迟输出(发送)。