求助关于modbus协议crc效验的问题。。。

if ( com6.byte_rxd > 4 ) //接收到应答 接收室外机数据长度计数
{
bFM3_MFS6_UART_SCR_RIE = 0; // disable Rxd
CRC(sbuf,com6.byte_rxd); //--添加以com6.comm_buf为数组名,com6.byte_rxd为长度的CRC校验码

if ( uchCRCLo == 0 && uchCRCHi == 0 ) //??
{
i = op_modbus(sbuf); //返回的是应答长度
}
}
if ( i )
{
com6.byte_txd = com6.byte_rxd;
com6_start_send(); //发送
}

这段程序中为什么是判断crc效验是0才确定返回长度,为什么不是判断接收的crc是不是和发送的crc是一样的才确定返回长度呢??这是modbus协议。。我不理解啊,求助大神给点指导。。

你这个不是MODBUS协议的问题,而是对CRC校验的概念不明确,CRC是循环的,全称是循环冗余校验码。
针对你的问题,我们举这样一个例子,我们约定校验方式为“累加和为零”,这个简单好理解。
假设现在要发送N个字节的数据,累加和为0xAB,按字节累加,抛弃进位,
校验字是这样得到的 0x00-0xAB=0x55,
发送方发送N个字节后附上校验字0x55就可以了。
显然,发送的这N+1个字节的“累加和为零”。
接收方收到所有N+1个字节,加起来,检查“累加和为零”就可以了,不用要明确的去检查校验字是不是0x55。使用数据的时候,取N个字节,最后的校验字节丢弃就可以了。

CRC与此类似,不过是用多项式除法代替按字节累加而已。
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-04-16
看完整的源程序吧

一端程序能看出什么呢来自:求助得到的回答
第1个回答  2013-04-16
你做仪表吗,当初我也是在这些上搞不懂,仔细想想,多做实验,慢慢就懂了

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

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

求助s7-200的crc校验问题
引用 wode1949 的回复内容:回复内容:对:miy_gongkong关于既然你调用了 Modbus RTU 库指令, CRC 校验 在内部就完成了,不需要你再 额外 去调用 CRC 校验程序, CRC 校验是在每一帧数据 发送或接收完成时 就要调用的。 内容的回复:我就是在这儿卡住了,不知道西门子modbus rtu的库到底包含什么程序...

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

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

请教一下plc与变频器通讯中的CRC校验,在8位数据与CRC寄存器异或后最低位...
变频器通信采用CRC校验时,通常遵循Modbus RTU协议。下面通过几个步骤来理解CRC校验的具体过程。首先,起始数据设定为FFFF(即十六进制的16位)。接着,将这个初始值与第一个字节进行异或操作。然后,对结果进行右移操作。如果右移时移出的位是0,那么继续进行右移;如果移出的位是1,则需要与特定的权数...

非常急!请高人解答! 在MODBUS功能码测试中CRC校验是低字节在前还是高...
高字节在前,这个没有为什么的,只是一种规定,大家都这样认定在校验时就不会错,如果发送端是高字节在前,而收信端在校验时当做是低字节在前的话肯定得到校验错误的结果。

modbus协议的CRC循环冗余校验位,校验的究竟是什么,是数据位吗
CRC叫做循环冗余校验,是检验发送数据是否正确的一种方法。比如你发过来的是0x010300000003这个数据,要是发送过程中出现了干扰,变成了其他数据比如0x010300000103,这样送到设备上会出问题的。所以MODBUS利用了一种方法,就是把每一个BYTE的数据和一个固定值(16位数值)进行一次运算(循环的,比如上面的...

modbus协议CRC校验计算方式?该怎么计算?
CRC在应用中有很多差异花的标准,数据传输有的高位在前,有的低位在前,所以算法有些差异,有左移位的有右移位的。适应不同的硬件处理器,除数有2位、8、12、16、32位,对应CRC8、CRC16、CRC32等。为了计算首尾的bit,所以协议规定了计算初始补0000或FFFF,通过大量计算,协议规定了优选的除数,就是...

C51 modbus rtu crc下面这段代码校验结果总是不对,请高手指教,不胜感激...
这个函数的问题在于:1、每次只能计算1个字节数据的CRC值,若有多个字节,须调用多次;2、字节数据,应把(uint address)改为(uchar address)3、应计算完全部字节数据的CRC值之后,再把CRC值高、低字节对调,所以代码中提前处理了低8位、高8位,导致结果错误。

相似回答