Modbus-RTU通讯协议中CRC校验码的计算步骤及算法代码

Modbus-RTU通讯协议中CRC校验码的计算步骤及算法代码在 CRC 计算时只用 8 个数据位 起始位及停止位 如有奇偶校验位也包括奇偶校验位 都不参与 CRC 计算 CRC 计算方法是 1 预置 1 个 16 位的寄存器为十六进制 FFFF 全 1 此寄存器为 CRC 寄存器 2 把第一个 8 位二进制数据 即通讯信息帧的第一个字节 与 16 位的 CRC 寄存器的低八位相异或 吧结果存放于 CRC 寄存器

在CRC计算时只用8个数据位,起始位及停止位,如有奇偶校验位也包括奇偶校验位,都不参与CRC计算。

CRC计算方法是:

1、 预置1个16位的寄存器为十六进制FFFF(全1),此寄存器为CRC寄存器

2、 把第一个8位二进制数据(即通讯信息帧的第一个字节)与16位的CRC寄存器的低八位相异或,吧结果存放于CRC寄存器。

3、 把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检测右移后的移出位。

4、 如果移出位为零,则重复第三步(再次右移一位);如果移出位为1,CRC寄存器与多项式A001进行异或。

5、 重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理。

6、 重复步骤2和5,进行通讯信息帧下一个字节的处理。

7、 将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低字节进行交换

8、 最后得到的CRC寄存器内容即为:CRC校验码。

Uint16 GetCrcData(Uint8 *buffer, Uint32 len) { Uint16 wcrc = 0XFFFF;//16位crc寄存器预置 Uint8 temp; Uint32 i = 0, j = 0;//计数 for (i = 0; i < len; i++)//循环计算每个数据 { temp = *buffer & 0X00FF;//将八位数据与crc寄存器亦或 buffer++;//指针地址增加,指向下个数据 wcrc ^= temp;//将数据存入crc寄存器 for (j = 0; j < 8; j++
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/220822.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午7:34
下一篇 2026年3月17日 下午7:34


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号