打印
[MCU]

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

[复制链接]
920|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
HYJ小白|  楼主 | 2023-7-1 17:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
协议是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校验,随便就能搜到程序。

使用特权

评论回复
5
forgot| | 2023-7-4 13:42 | 只看该作者
不是modbus-RTU是CRC16校验,我算了一下,结果对不上,不知道是咋算的

使用特权

评论回复
6
15625004279| | 2023-7-4 14:10 | 只看该作者
forgot 发表于 2023-7-4 13:42
不是modbus-RTU是CRC16校验,我算了一下,结果对不上,不知道是咋算的

感觉他的数据不完整

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

21

帖子

1

粉丝