程序中使用CRC校验数据

(1.60.1及其以上上位机版本支持,目前仅支持crc-16/modbus)

使用crc校验的步骤

初始化crc校验

1 //初始化crc
2 crcrest 1,0xffff

使用crcputh/crcputs/crcputu将需要的数据放入校验

crcputh的用法参考printh

crcputs的用法参考prints

 1 //将0x03 0x25放入crc校验
 2 crcputh 03 25
 3
 4 //将字符串"aaa"放入crc校验
 5 crcputs "aaa",0
 6
 7 //将字符串t0.txt放入crc校验
 8 crcputs t0.txt,0
 9
10 //将字符串t1.txt的前6个字节放入crc校验
11 crcputs t1.txt,6
12
13 //将数值16的低2字节放入crc校验
14 crcputs 16,2
15
16 //将数值n0.val放入crc校验
17 crcputs n0.val,0
18
19 //将数值n1.val的低2字节放入crc校验
20 crcputs n1.val,2
21
22 //将串口缓冲区的第5个字节开始的24个字节放入crc校验
23 crcputu 5,24

获取crc计算结果

crcval变量即为计算结果,可以随时获取

1 //将crcval的数据发送出去
2 prints crcval,2

crc校验示例

未进行校验的代码如下所示

 1//发送55 aa 作为帧头
 2printh 55 aa
 3
 4//串口发送数值变量n0.val的低2字节
 5prints n0.val,2
 6
 7//串口发送字符串变量t0.txt
 8prints t0.txt,0
 9
10//发送0d 0a作为帧尾
11printh 0d 0a

将上方的代码添加crc-16校验并发送出去

 1//重置crc校验
 2crcrest 1,0xffff
 3
 4//发送55 aa
 5printh 55 aa
 6
 7//将55 aa 放入crc校验
 8crcputh 55 aa
 9
10//串口发送数值变量n0.val的低2字节
11prints n0.val,2
12
13//将数值变量n0.val的低2字节放入crc校验
14crcputs n0.val,2
15
16//串口发送字符串变量t0.txt
17prints t0.txt,0
18
19//将字符串变量t0.txt放入crc校验
20crcputs t0.txt,0
21
22//发送0d 0a作为帧尾
23printh 0d 0a
24
25//将0d 0a放入crc校验
26crcputh 0d 0a
27
28//串口发送校验结果
29prints crcval,2

在大部分的应用场景下,crc校验仅仅是将printh改成crcputh,prints改为crcputs

../_images/crc2_1.jpg

注意

注意放入crc校验中变量的长度

crcputs n0.val,3,crcputs n0.val,2,crcputs n0.val,1和crcputs n0.val,0得出的crc校验值是完全不同的4个值!

串口屏计算出来的crc结果和单片机计算出来的结果不同如何排查

借助网上的crc在线校验工具,先计算出标准的modbus-crc16的值,然后对比一下是串口屏计算出来的crc有问题还是单片机计算出来的crc有问题,针对问题修改代码即可