求助关于modbus协议crc效验的问题。。。
if(com6.byte_rxd>4)//接收到应答接收室外机数据长度计数{bFM3_MFS6_UART_SCR_RIE=0;//disableRxdCRC(sbuf,c...
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协议。。我不理解啊,求助大神给点指导。。 展开
{
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协议。。我不理解啊,求助大神给点指导。。 展开
3个回答
展开全部
你这个不是MODBUS协议的问题,而是对CRC校验的概念不明确,CRC是循环的,全称是循环冗余校验码。
针对你的问题,我们举这样一个例子,我们约定校验方式为“累加和为零”,这个简单好理解。
假设现在要发送N个字节的数据,累加和为0xAB,按字节累加,抛弃进位,
校验字是这样得到的 0x00-0xAB=0x55,
发送方发送N个字节后附上校验字0x55就可以了。
显然,发送的这N+1个字节的“累加和为零”。
接收方收到所有N+1个字节,加起来,检查“累加和为零”就可以了,不用要明确的去检查校验字是不是0x55。使用数据的时候,取N个字节,最后的校验字节丢弃就可以了。
CRC与此类似,不过是用多项式除法代替按字节累加而已。
针对你的问题,我们举这样一个例子,我们约定校验方式为“累加和为零”,这个简单好理解。
假设现在要发送N个字节的数据,累加和为0xAB,按字节累加,抛弃进位,
校验字是这样得到的 0x00-0xAB=0x55,
发送方发送N个字节后附上校验字0x55就可以了。
显然,发送的这N+1个字节的“累加和为零”。
接收方收到所有N+1个字节,加起来,检查“累加和为零”就可以了,不用要明确的去检查校验字是不是0x55。使用数据的时候,取N个字节,最后的校验字节丢弃就可以了。
CRC与此类似,不过是用多项式除法代替按字节累加而已。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
您可能需要的服务
百度律临官方认证律师咨询
平均3分钟响应
|
问题解决率99%
|
24小时在线
立即免费咨询律师
18146人正在获得一对一解答
天津金色童年5分钟前提交了问题
北京小白兔4分钟前提交了问题
重庆晨曦微光6分钟前提交了问题