modbus协议CRC校验计算方式?该怎么计算?
尽量简单点说: 一般传输错误大概率发生在单个数据位,所以需要监测每个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校验码。
执行八次之后就不再执行移位操作了。
不用知道怎么来 会计算就可以了 下载一个计算软件
生成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 值于报文时,注意高低字节必须交换。

非常急!请高人解答! 在MODBUS功能码测试中CRC校验是低字节在前还是高字节在前?为什么?
这是MODBUS协议里的一段话 ------ 使用RTU方式时,错误校验码为一个16位的值,2个8位字节。错误校验值是对信息内容执行CRC校验结果。CRC校验信息帧是最后的一个数据,得到的校验码先送低位字节,后送高位字节,所以CRC码的高位字节是最后被传送的信息。 现在网上提供的好的MODBUS RTU的CRC16查表的程序,都是反过来计算的,而且提供的CRC16余数表也是高低字节相反的,所以计算的CRC校验码是高低字节相反的,所以就变成楼上说的。
'''MODBUS的采用CRC16校验,检验码两个字节, 按照规范 要求CRC按照低字节在前,高字节在后的顺序传送
高字节在前,这个没有为什么的,只是一种规定,大家都这样认定在校验时就不会错,如果发送端是高字节在前,而收信端在校验时当做是低字节在前的话肯定得到校验错误的结果。
楼上几位可以用modscan看一下数据流。 modbus协议CRC 低位先发送,高位后发送。 这样接收端把接受的报文整体进行crc计算,结果是0,可以直接用作判断数据是否正确。
对。高字节在前,没有为什么啊。

关于MODBUS协议的CRC校验
1、上位机须按照MODBUS协议的命令格式发送数据(包括计算的CRC值),传感器才能正确辨识数据。若无CRC值,传感器将返回含有错误号的应答包,不会得到正确结果。 2、按照1的所做后,上位机能接收到传感器的数据。你可以不对接收的数据进行CRC校验,但这样不能辨识接收数据的准确性。 标准的做法,发送前计算CRC值并一起发送,接收后也计算CRC值并与接收的校验码对比是否相等,以辨别数据是否准确。

modbus中如何计算CRC效验(人工计算)
在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校验码。
我搞过MODBUS,对它很熟悉,用C++编过几千行代码,程序一直在运行着。 MODBUS的CRC不是简单的相加运算,挺复杂的,所以,要手工算很麻烦。如果你C代码看不懂,就很难搞清这个CRC运算的,算法有两种:慢速的:要移位运算;高速的:有一个很大的对照表,你说怎能用手工说清楚?! 计算程序我有,不贴了,反正你也不想看。

关于MODBUS协议的CRC校验
1、上位机须按照MODBUS协议的命令格式发送数据(包括计算的CRC值),传感器才能正确辨识数据。若无CRC值,传感器将返回含有错误号的应答包,不会得到正确结果。 2、按照1的所做后,上位机能接收到传感器的数据。你可以不对接收的数据进行CRC校验,但这样不能辨识接收数据的准确性。 标准的做法,发送前计算CRC值并一起发送,接收后也计算CRC值并与接收的校验码对比是否相等,以辨别数据是否准确。
按照标准协议编即可,但需要了解传感器相应的参数设置,波特率等参数。 接收的时候必须要CRC校验,否则你不知道你接收的数据是不是正确的数据,就要靠CRC校验来判断。不用 的后果就是,你没办法处理数据了,不知道哪些是正确的数据~ 综上,必须CRC校验~~
CRC校验 能保证接收数据的准确 发送前计算,一起发送接收后也要计算,再与发送过来的 校验码 比对,前后不一致显然接收的数据有误 百度百科里有介绍的

本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/70689.html。