求助关于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协议。。我不理解啊,求助大神给点指导。。
展开
 我来答
linnjing
2013-04-16 · TA获得超过2632个赞
知道大有可为答主
回答量:1230
采纳率:91%
帮助的人:522万
展开全部
你这个不是MODBUS协议的问题,而是对CRC校验的概念不明确,CRC是循环的,全称是循环冗余校验码。
针对你的问题,我们举这样一个例子,我们约定校验方式为“累加和为零”,这个简单好理解。
假设现在要发送N个字节的数据,累加和为0xAB,按字节累加,抛弃进位,
校验字是这样得到的 0x00-0xAB=0x55,
发送方发送N个字节后附上校验字0x55就可以了。
显然,发送的这N+1个字节的“累加和为零”。
接收方收到所有N+1个字节,加起来,检查“累加和为零”就可以了,不用要明确的去检查校验字是不是0x55。使用数据的时候,取N个字节,最后的校验字节丢弃就可以了。

CRC与此类似,不过是用多项式除法代替按字节累加而已。
匿名用户
2013-04-16
展开全部
看完整的源程序吧

一端程序能看出什么呢
来自:求助得到的回答
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
eang2010
2013-04-16
知道答主
回答量:71
采纳率:0%
帮助的人:11.6万
展开全部
你做仪表吗,当初我也是在这些上搞不懂,仔细想想,多做实验,慢慢就懂了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
您可能需要的服务
百度律临官方认证律师咨询
平均3分钟响应 | 问题解决率99% | 24小时在线
立即免费咨询律师
18146人正在获得一对一解答
天津金色童年5分钟前提交了问题
北京小白兔4分钟前提交了问题
重庆晨曦微光6分钟前提交了问题
下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消
还有疑问? 马上咨询35603位在线律师,3分钟快速解答
立即免费咨询律师

辅 助

模 式