modbus协议CRC校验计算方式?该怎么计算?

例如我要往一个串口发送
01 03 00 01 00 08 ,他的校验15 CC是怎么计算来的?找了不少资料,来来去去就那么一两句话,什么或运算,冗余的,看的懵懵懂懂,希望有一个详细的解释,步骤清楚一点的,(能多清楚就多清楚吧)如果可以,最好希望有注解的C++语言代码,满意可加分!

尽量简单点说: 一般传输错误大概率发生在单个数据位,所以需要监测每个bit位。把要发送的数据所有BIT首尾相连,变成一个8bit乘字节长度的大数,然后约定一个除数,计算最后的余数就是CRC。做二进制除法,每除一位时要做减法,商为1时减除数,商为零时不减除数,然后移到下一位继续算(这段不懂回忆一下小学10进制除法)。在实际应用中,为适应高速通信,二进制除法采用简易算法,减法不借位,就是异或替代减法。CRC在应用中有很多差异花的标准,数据传输有的高位在前,有的低位在前,所以算法有些差异,有左移位的有右移位的。适应不同的硬件处理器,除数有2位、8、12、16、32位,对应CRC8、CRC16、CRC32等。为了计算首尾的bit,所以协议规定了计算初始补0000或FFFF,通过大量计算,协议规定了优选的除数,就是多项式。
温馨提示:内容为网友见解,仅供参考
第1个回答  2021-12-15
CRC计算方法是:
1、加载一值为0XFFFF的16位寄存器,此寄存器为CRC寄存器。
2、把第一个8位二进制数据(即通讯信息帧的第一个字节)与16位的CRC寄存器的相异或,异或的结果仍存放于该CRC寄存器中。
3、把CRC寄存器的内容右移一位,用0填补最高位,并检测移出位是0还是1。
4、如果移出位为零,则重复第三步(再次右移一位);如果移出位为1,CRC寄存器与0XA001进行异或。
5、重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理。
6、重复步骤2和5,进行通讯信息帧下一个字节的处理。
7、将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低字节进行交换
8、最后得到的CRC寄存器内容即为:CRC校验码。
第2个回答  2012-12-01
执行八次之后就不再执行移位操作了。追问

请问有相关的C语言或者C++语言的代码么?那样我好理解些,简单的一句话,我没弄太懂!

第3个回答  2012-12-03
不用知道怎么来 会计算就可以了 下载一个计算软件追问

我就是有些这样的偏执,想知道所以然!根据C语言代码和别人说的解释,感觉完全不对头!好困惑!

追答

循环冗余校验(CRC)生成步骤比较复杂 貌似要根据前面的数据位串生成多项式 然后用前面的数据位串除以多项式的系数生成的数据位 所得的余数不满16的添0

第4个回答  推荐于2017-05-15
生成 CRC 的过程为:
1. 将一个 16 位寄存器(称作 CRC 寄存器)初始赋值为十六进制 FFFF (全 1);
2. 将报文的第一个字节( 8位)与 16 位 CRC 寄存器的低字节异或,结果置于 CRC 寄存器;
3. 将 CRC 寄存器右移 1位 (向 LSB 方向), MSB 充零,并检测 LSB:
4. (如果 LSB 为 0): 重复步骤 3 (另一次移位).
(如果 LSB 为 1): 对 CRC 寄存器异或多项式值 0xA001 (1010 0000 0000 0001).
5. 重复步骤 3 和 4,直到完成 8 次移位操作后,一个字节的处理完毕。
6. 对报文中的下一个字节重复步骤 2 到 5继续此操作,直至所有报文被处理完毕。
7. CRC 寄存器中的最终值为 CRC 值.
8. 当放置 CRC 值于报文时,注意高低字节必须交换。追问

先拿01与11111111 11111111的前八个1异或,得到结果1111111011111111,然后这里是先移位,再检测执行第4步码?我右移一位,得到结果0111111101111111,此时LSB为1,异或0xA001,得到11011111 01111110,这算执行一次移位操作,再执行到移位七次,得到0110 0000 0011 1110,此时需要检测LSB为0,并对它再一次移位么?还是执行第八次移位后,就不判断LSB是否为零执行后续操作了?
还有就是高低位还弄不懂

追答

你的理解有问题,首先要明白MSB是指bit15,LSB是指bit0;高字节是指bit15~bit8,低字节是指bit7~bit0。01若是报文第一个字节值(16进制,其2进制是00000001),那么:
第2步,01H与11111111 11111111的低字节异或,结果是11111111 11111110。
第3步,右移一位就成为01111111 11111111,检测的LSB原意是右移出来的位(即右移之前的LSB)。
第4步,判断LSB=0就直接返回第3步;LSB=1则把CRC寄存器与多项式值 0xA001异或,再返回第3步。
第5步,由于01H有8个bit,所以必须进行8 次”右移-判断是否要异或“操作,一个字节的处理才完毕。
第6步,按照第2~5步的操作处理第2个、第3个......字节,直至所有的报文字节被处理完毕。

追问

字数太多了,只好截图了!

追答

第一次的是引用资料,先右移再检测(移出的)LSB。
第二次说的也没错,先右移再检测右移之前的LSB,其实与第一次操作是一样的。

请注意:原资料的描述不够准确,因为右移出来的位不能再称为LSB。我加上括号的3个字就清楚了。

本回答被提问者和网友采纳

modbus协议CRC校验计算方式?该怎么计算?
把要发送的数据所有BIT首尾相连,变成一个8bit乘字节长度的大数,然后约定一个除数,计算最后的余数就是CRC。做二进制除法,每除一位时要做减法,商为1时减除数,商为零时不减除数,然后移到下一位继续算(这段不懂回忆一下小学10进制除法)。在实际应用中,为适应高速通信,二进制除法采用简易算法...

modbus中如何计算CRC效验(人工计算)
CRC计算方法是:1、 加载一值为0XFFFF的16位寄存器,此寄存器为CRC寄存器。2、 把第一个8位二进制数据(即通讯信息帧的第一个字节)与16位的CRC寄存器的相异或,异或的结果仍存放于该CRC寄存器中。3、 把CRC寄存器的内容右移一位,用0填补最高位,并检测移出位是0还是1。4、 如果移出位为零,则...

Modbus RTU CRC校验详细步骤CRC值怎么计算
CRC计算方法是:1、 预置1个16位的寄存器为十六进制FFFF(全1),此寄存器为CRC寄存器 2、 把第一个8位二进制数据(即通讯信息帧的第一个字节)与16位的CRC寄存器的低八位相异或,吧结果存放于CRC寄存器。3、 把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检测右移后的移出位。4...

Modbus CRC校验算法
1. 计算法:\/\/ modbus计算16位crc uint16 calcrc16(uint8 *p, uint8 len)...2. 查表法:\/\/ 高CRC字节初始化...uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex];uchCRCLo = auchCRCLo[uIndex];3. 简单查表法2:const uint16 wCRCTalbeAbs[]...uint16 CRC16_2(uint8* pchMsg, ui...

MODBUS通讯CRC校验码怎么算,有那位能告诉我呀
V(x)=A(x)g(x)=xRm(x)+r(x);其中: m(x)为K次信息多项式, r(x)为R-1次校验多项式,g(x)称为生成多项式:g(x)=g0+g1x+ g2x2+...+g(R-1)x(R-1)+gRxR 发送方通过指定的g(x)产生CRC码字,接收方则通过该g(x)来验证收到的CRC码字。3 | 评论 向TA求助 回答者: WTAO...

modbus. crc校验问题,请帮我具体计算下00和01分别的crc校验码是多少...
Modbus一般采用CRC16校验,特征多项式取0xA001。你可以用标准的CRC16算法代码,不过要更改特征多项式。所以一般大家都是用查表法处理Modbus的CRC校验部分的,反正也就512个字节。具体的代码你上网搜索“Modbus CRC16”,一抓一大把,我在这里就不贴了。十六进制数0x00的校验码为0x40BF,0x11的校验码为...

求助关于modbus协议crc效验的问题。。。
你这个不是MODBUS协议的问题,而是对CRC校验的概念不明确,CRC是循环的,全称是循环冗余校验码。针对你的问题,我们举这样一个例子,我们约定校验方式为“累加和为零”,这个简单好理解。假设现在要发送N个字节的数据,累加和为0xAB,按字节累加,抛弃进位,校验字是这样得到的 0x00-0xAB=0x55,发送方...

modbus协议的CRC循环冗余校验位,校验的究竟是什么,是数据位吗
所以MODBUS利用了一种方法,就是把每一个BYTE的数据和一个固定值(16位数值)进行一次运算(循环的,比如上面的数据中01运算完结果用在03上运算,再往下以此类推),最后得到一个2BYTE的数值(16位)。也就是经过这一系列的运算,发送方和接收方算出来的CRC数值应该相同的;如果传送中数据的某一位...

Modbus通讯协议的数据校验方式
X↑16+X↑15+X↑2+1可以表示为二进制数11000,0000,0000,0101。整数商位忽略不记,16位余数加入该报文(MSB先发送),成为2个CRC校验字节。余数中的1全部初始化,以免所有的零成为一条报文被接收。经上述处理而含有CRC字节的报文,若无错误,到接收设备后再被同一多项式(...

modbus协议RTU模式校验码怎么计算
modbus协议RTU模式校验码是CRC16-2编码。它由两个字节构成,在开始时CRC寄存器的每一位都预置为1,然后把CRC寄存器与8-bit的数据进行异或 (异或:二进制运算 相同为0,不同为1;0^0=0;0^1=1;1^0=1;1^1=0) ,之后对CRC寄存器从高到低进行移位,在最高位(MSB)的位置补零,而最低位(...

相似回答