这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 高校专区» 坤创E-Geek/天科大新电社» 【2021全国电赛】坤创2队记录:02 modbus协议学习(一)

共1条 1/1 1 跳转至

【2021全国电赛】坤创2队记录:02 modbus协议学习(一)

菜鸟
2021-07-21 20:34:19 打赏

一,关于MODBUS的CRC校验

CRC 域是两个字节,包含一 16 位的二进制值。它由传输设备计算后加入到消息中。接收设备重新计算收到消息的CRC,并与接收到的CRC域中的值比较,如果两值不同,则有误。

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

CRC 计算方法是:

1、加载一值为 0XFFFF 的 16 位寄存器,此寄存器为 CRC 寄存器。

2、该 16 位寄存器的高位字节与开始 8 位字节进行“异或”运算。运算结果放入这个 16 位寄存器。

3、把 CRC 寄存器的内容右移一位,用 0 填补最高位,并检测移出位是 0 还是 1。

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

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

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

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

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

二,代码如下

u16 Modbus_CRC16( u8 *puchMsg, u16 usDataLen ) { u8 len = usDataLen -2;//计算数据长度 u16 crc_result = 0xffff;//加载一个16位的寄存器 int crc_num=0; int xor_flag =0; int m=0; int i=0; for( i=0;i>=1; if(xor_flag) crc_result^=0xa001; crc_num=(crc_result&0x0001); } } return crc_result; }

modbus通讯协议.pdf




关键词: 2021全国电赛 modbus

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]