望天hous 发表于 2018-11-20 22:24

VB代码写的modbus的rtu协议的CRC(循环冗余校验)

本帖最后由 望天hous 于 2018-11-21 11:10 编辑

最近闲来无事看了一下mudbus的RTU协议
CRC计算方法是:
1、预置1个16位的寄存器为十六进制FFFF(全1),此寄存器为CRC寄存器
2、把第一个8位二进制数据(即通讯信息帧的第一个字节)与16位的CRC寄存器的低八位相异或,把结果存放于CRC寄存 器。
3、把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检测右移后的移出位。
4、如果移出位为零,则重复第三步(再次右移一位);如果移出位为1,CRC寄存器与多项式0xa001进行异或。
5、重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理。
6、重复步骤2和5,进行通讯信息帧下一个字节的处理。
7、将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低字节进行交换
8、最后得到的CRC寄存器内容即为:CRC校验码。

度娘上类似的说明代码很多,但是没有我想用的 ,下面结合实例说明一下

见附件:图片

现场MODBUS设备的报文



蓝色区域是发送请求上位机代码(这里也不再叙述各个代码含义,感兴趣可以问问度娘),灰色区域是返回数据(感兴趣的可以看看)这里说一下蓝色区域的最后 C4 2C 和A5 E5分别是前面的数据CRC校正码,低位在前高位在后 循环冗余码校验英文名称为Cyclical Redundancy Check,简称CRC。它是利用除法及余数的原理来作错误侦测(Error Detecting)的。他将要发送的数据比特序列当作一个多项式f(x)的系数,发送时用双方预先约定的生成多项式G(x)去除,求得一个余数多项式,将余数多项式加到数据多项式之后发送到接收端,接收端同样用G(x)去除接收到的数据,进行计算,然后把计算结果和实际接收到的余数多项式数据进行比较,相同的话表示传输正确。CRC校验检错能力强,容易实现,是目前应用最广的检错码编码方式之一。
在国际标准中,根据生成多项式G(x)的不同,CRC又可分为以下几种标准:
  ①CRC-12码:    G(x)=X12+X11+X3+X2+X+1
  ②CRC-16码:    G(x)=X16+X15+X2+1
  ③CRC-CCITT码: G(x)=X16+X12+X5+1
  ④CRC-32码:    G(x)=X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+X+1


这里用的是第 二种标准废话少说上成品展示图

见附录图片:第一个

第一个

见附录图片:第二个

第二个
下面是源码和成品,


感兴趣可以下载看看,共同学习共同进步

有用的话记得收藏,点赞,解压密码:hous

望天hous 发表于 2018-11-21 11:11

重新排了一下版,要不看起来太乱了{:1_893:}

R.E.D 发表于 2018-11-24 21:20

收藏,谢谢分享

望天hous 发表于 2018-11-28 20:39

R.E.D 发表于 2018-11-24 21:20
收藏,谢谢分享

谢谢,支持,,共同学习共同进步

Iciness 发表于 2019-1-9 23:23


收藏,谢谢分享

hack5332817 发表于 2020-11-12 13:04

厉害我的乖乖a
页: [1]
查看完整版本: VB代码写的modbus的rtu协议的CRC(循环冗余校验)