modbus协议crc校验c语言代码,MODBUS通信协议中CRC校验码的计算(C/C++)实现

本文详细介绍了MODBUS通信协议中的CRC校验码计算方法,包括CRC的生成流程和C语言代码实现,提供了两种不同的计算CRC的函数,并给出了测试代码示例。
摘要由CSDN通过智能技术生成

错误检测的方法

错误校验(CRC)域占用两个字节,包含了一个16位的二进制值。CRC值由传输设备计算出来,然后附加到数据帧上,接收设备在接收数据时重新计算CRC值,然后与接收到的CRC域中的值进行比较,如果这两个值不相等,就发生了错误。

CRC运算时,首先将一个16位的寄存器预置为全1,然后连续把数据帧中的每个字节中的8位与该寄存器的当前值进行运算,仅仅每个字节的8个数据位参与生成CRC,起始位和终止位以及可能使用的奇偶位都不影响CRC。在生成CRC时,每个字节的8位与寄存器中的内容进行异或,然后将结果向低位移位,高位则用“0”补充,最低位(LSB)移出并检测,如果是1,该寄存器就与一个预设的固定值(0A001H)进行一次异或运算,如果最低位为0,不作任何处理。

上述处理重复进行,直到执行完了8次移位操作,当最后一位(第8位)移完以后,下一个8位字节与寄存器的当前值进行异或运算,同样进行上述的另一个8次移位异或操作,当数据帧中的所有字节都作了处理,生成的最终值就是CRC值。

生成一个CRC的流程为:

1

预置一个16位寄存器为0FFFFH(全1),称之为CRC寄存器。

2

把数据帧中的第一个字节的8位与CRC寄存器中的低字节进行异或运算,结果存回CRC寄存器。

3

将CRC寄存器向右移一位,最高位填以0,最低位移出并检测。

4

如果最低位为0:重复第三步(下一次移位);如果最低位为1:将CRC寄存器与一个预设的固定值(0A001H)进行异或运算。

5

重复第三步和第四步直到8次移位。这样处理完了一个完整的八位。

6

重复第2步到第5步来处理下一个八位,直到所有的字节处理结束。

7

最终CRC寄存器的值就是CRC的值。

此外还有一种利用预设的表格计算CRC的方法,它的主要特点是计算速度快,但是表格需要较大的存储空间,该方法此处不再赘述,请参阅相关资料。

1.6

通讯应用格式祥解

本节所举实例将尽可能的使用如图所示的格式,(数字为16进制)。

Addr

Fun

Data start  reg hi

Data start  reg lo

Data #of regs hi

Data #of regs l

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值