HYJ小白 发表于 2023-7-1 17:40

一个modbus-RTU协议的校验计算

协议是RS485 modbus-RTU协议
数据:04 00 00 校验结果是:F3 C2
数据:05 00 00,校验结果是:A2 02
数据:06 00 00,校验结果是:52 02
数据:07 00 00,校验结果是:03 C2
数据:08 00 00,校验结果是:33 C1
数据:09 00 00,校验结果是:62 01
这种会是什么校验方式??有没有大佬清楚的

zhanan 发表于 2023-7-2 08:41

CRC-16 循环冗余校验:1 + x2 + x 15 + x 16
产生CRC的过程:
1.把16位CRC寄存器置成FFFFH.
2.第一个8位数据与CRC寄存器低8位进行异或运算,把结果放入CRC寄存器。
3.CRC寄存器向右移一位,MSB填零,检查LSB.
4.(若LSB为0):重复3,再右移一位。
(若LSB为1):CRC寄存器与0xA001进行异或运算
5.重复3和4直至完成8次移位,完成8位字节的处理。
6.重复2至5步,处理下一个8位数据,直至全部字节处理完毕。
7.CRC寄存器的最终值为CRC值。
8.在发送时CRC低8位先发,高8位在后。

uint mb_crc16(uchar *np,uchar nlen)// 计算crc16校验: 数据、字节数
{
uchar nxh;
uint ncrc =0xFFFF;// crc初值
while(nlen--)
{
    ncrc^=*np++;// crc低字节和数据的一个字节异或
    for(nxh=0;nxh<8;nxh++)
    {
      if (ncrc & 0x0001) { ncrc>>=1; ncrc^=0xA001;} // 检查crc最低位是1,右移一位后异或0xA001
      else { ncrc>>=1; }// 是0,直接右移一位
    }
}
return (ncrc);// 返回crc
}

在modbus通信程序中
...
ncrc=mb_crc16(数组,字节数); // 计算crc
数组[字节数++]=ncrc;    // crc低字节
数组[字节数++]=ncrc>>8; // crc高字节
...
帖子下方相关下载,已经把有关资料列出来哦

zhanan 发表于 2023-7-2 08:56

CW32F003内部有CRC-16计算单元,计算CRC就更方便了:往CRC数据寄存器放数,从CRC结果寄存器读结果

coody 发表于 2023-7-4 13:23

modbus-RTU是CRC16校验,随便就能搜到程序。

forgot 发表于 2023-7-4 13:42

不是modbus-RTU是CRC16校验,我算了一下,结果对不上,不知道是咋算的

15625004279 发表于 2023-7-4 14:10

forgot 发表于 2023-7-4 13:42
不是modbus-RTU是CRC16校验,我算了一下,结果对不上,不知道是咋算的

感觉他的数据不完整{:titter:}
页: [1]
查看完整版本: 一个modbus-RTU协议的校验计算