modbus协议CRC校验计算方式?该怎么计算?
例如我要往一个串口发送010300010008,他的校验15CC是怎么计算来的?找了不少资料,来来去去就那么一两句话,什么或运算,冗余的,看的懵懵懂懂,希望有一个详细的解...
例如我要往一个串口发送
01 03 00 01 00 08 ,他的校验15 CC是怎么计算来的?找了不少资料,来来去去就那么一两句话,什么或运算,冗余的,看的懵懵懂懂,希望有一个详细的解释,步骤清楚一点的,(能多清楚就多清楚吧)如果可以,最好希望有注解的C++语言代码,满意可加分! 展开
01 03 00 01 00 08 ,他的校验15 CC是怎么计算来的?找了不少资料,来来去去就那么一两句话,什么或运算,冗余的,看的懵懵懂懂,希望有一个详细的解释,步骤清楚一点的,(能多清楚就多清楚吧)如果可以,最好希望有注解的C++语言代码,满意可加分! 展开
5个回答
展开全部
尽量简单点说: 一般传输错误大概率发生在单个数据位,所以需要监测每个bit位。把要发送的数据所有BIT首尾相连,变成一个8bit乘字节长度的大数,然后约定一个除数,计算最后的余数就是CRC。做二进制除法,每除一位时要做减法,商为1时减除数,商为零时不减除数,然后移到下一位继续算(这段不懂回忆一下小学10进制除法)。在实际应用中,为适应高速通信,二进制除法采用简易算法,减法不借位,就是异或替代减法。CRC在应用中有很多差异花的标准,数据传输有的高位在前,有的低位在前,所以算法有些差异,有左移位的有右移位的。适应不同的硬件处理器,除数有2位、8、12、16、32位,对应CRC8、CRC16、CRC32等。为了计算首尾的bit,所以协议规定了计算初始补0000或FFFF,通过大量计算,协议规定了优选的除数,就是多项式。
展开全部
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校验码。
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校验码。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
执行八次之后就不再执行移位操作了。
追问
请问有相关的C语言或者C++语言的代码么?那样我好理解些,简单的一句话,我没弄太懂!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不用知道怎么来 会计算就可以了 下载一个计算软件
追问
我就是有些这样的偏执,想知道所以然!根据C语言代码和别人说的解释,感觉完全不对头!好困惑!
追答
循环冗余校验(CRC)生成步骤比较复杂 貌似要根据前面的数据位串生成多项式 然后用前面的数据位串除以多项式的系数生成的数据位 所得的余数不满16的添0
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
生成 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 值于报文时,注意高低字节必须交换。
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个......字节,直至所有的报文字节被处理完毕。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询