求助 modbus CRC16和效验(多项式8005)的计算方法 点击:2705 | 回复:1



zhangzisky

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 4回
  • 年度积分:0
  • 历史总积分:76
  • 注册:2010年6月13日
发表于:2015-08-05 09:01:31
楼主

看了网上的算法是这样的:
1、设置CRC寄存器,给其赋值0xffff;
2、将待校验数据的第一个字节(8bit)与16位CRC的低字节进行异或操作,结果存入CRC寄存器;
3、CRC寄存器向右移一位,MSB补零,移出并检查LSB;
4、如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码(8005)相异或,结果依然存入CRC寄存器;
5、重复第3、4步,直到8次移位全部完成。即一个8bit字节处理完毕;
6、重复第2至第5步,即依次处理后面的数据字节,直到全部数据处理完成;
7、最终CRC寄存器里的内容即为CRC值。
这是我按照上面的方法异或计算的但是得出来的和软件算的不一样,请帮助看看!(效验字节为01H)






高兴2018

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 60回
  • 年度积分:0
  • 历史总积分:972
  • 注册:2018年7月05日
发表于:2018-10-19 09:32:46
1楼

1、定义一个初始值为FFFF的16位的变量,该变量称为CRC寄存器。(想想在程序中,应该怎么表示16位的变量呢?)
2、把欲发送或接收消息的高8位和CRC寄存器的底8位作异或运算,并把结果在赋到CRC寄存器。
3、CRC寄存器右移1位(朝最低位),同时最高位添零。取出并检查最低位是否为1。(Visual Basic 里如何做移位的运算呢?)
4、如果为1,则CRC寄存器与多项式A001异或;如果为0,则重复第3步的动作。(Visual Basic 里如何判断一个字节里某个位的值呢?)
5、重复3和4直到完成了8次移位。这样完整的8位字节将完成处理了。
6、对于下一个8位字节的处理就是重复第2步到第5步了
7、把所有的欲发送或接收消息这样处理后, CRC寄存器里的值就是我们最终需要得到的CRC校验码。
如果你能正确回答我的问题,那么恭喜你,你自己可以用Visual Basic写数据采集卡的控制程序了。
三、Visual Basic程序实现
以江阴长江斯菲尔电力仪表公司CD194E系列多功能电力仪表的MODBUS-RTU通讯协议的报文格式为例,该表通信报文格式使用的校验方式就是CRC-16。通过对地址01H、命令04H、数据地址005CH和数据长度0004H的CRC-16运算后得到主机请求数据报文的CRC16的校验码为31DBH。


热门招聘
相关主题

官方公众号

智造工程师