这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 高校专区 » 坤创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<len;i++)
{
crc_result^=*puchMsg;
crc_num =( crc_result&0x0001);
for( m=0;m<8;m++)
{
if(crc_num==1)
xor_flag  =1;
else  
xor_flag  =0;
crc_result>>=1;
if(xor_flag)
crc_result^=0xa001;
crc_num=(crc_result&0x0001);
}
}
return crc_result;
}

modbus通讯协议.pdf




关键词: 2021全国电赛     modbus    

共1条 1/1 1 跳转至

回复

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