uint CRC16(uint address) //计算校验码
{
uint CRC;
uchar i;
CRC=0xFFFF;
for(i=0;i<8;i++)
{
CRC=CRC^address; //异域
if((CRC&1)!=0) //检测最低位是否为1
{CRC=(CRC>>1)^0xA001;} //如果为1右移一位后须异域0xA001
else
{CRC=CRC>>1;} //如果移出位为0,只须右移一位
}
TX_com[0]=(CRC&0x00FF); //校验结果低8位
TX_com[1]=(CRC&0xFF00)>>8; //检验结果高8位
return CRC;
}
C51modbusrtucrc下面这段代码校验结果总是不对,请高手指教,不胜感激!
答案:2 悬赏:10
解决时间 2021-11-13 01:49
- 提问者网友:星空下的寂寞
- 2021-11-12 22:36
最佳答案
- 二级知识专家网友:一起来看看吧
- 2021-11-12 23:08
这个函数的问题在于:
1、每次只能计算1个字节数据的CRC值,若有多个字节,须调用多次;
2、字节数据,应把(uint address)改为(uchar address)
3、应计算完全部字节数据的CRC值之后,再把CRC值高、低字节对调,所以代码中提前处理了低8位、高8位,导致结果错误。
1、每次只能计算1个字节数据的CRC值,若有多个字节,须调用多次;
2、字节数据,应把(uint address)改为(uchar address)
3、应计算完全部字节数据的CRC值之后,再把CRC值高、低字节对调,所以代码中提前处理了低8位、高8位,导致结果错误。
全部回答
- 1楼网友:爱情是怎么炼成的
- 2021-11-12 23:49
看看 CRC 的原理
然后再读解这个程序
再看看别人怎么说的。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯