程序中使用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](../_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有问题,针对问题修改代码即可
crc校验-样例工程下载
演示工程下载链接: