恭喜,你发布的帖子
发布于 2017-05-27 12:29:28
8楼
根据CRC16算法,01 03 00 00 00 03 得到的检验码是 0xCB05;
根据RTU的报文,CRC低字节放在前面,高字节放在后面。
/**原始计算 usNorCRC16 异或0xA001 效率比较低 (默认循环一个字节)
具体计算方法为:
1、设置CRC寄存器,给其赋值0xffff;
2、将待校验数据的第一个字节(8bit)与16位CRC的低字节进行异或操作,结果存入CRC寄存器;
3、CRC寄存器向右移一位,MSB补零,移出并检查LSB;
4、如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码(A001)相异或,结果依然存入CRC寄存器;
5、重复第3、4步,直到8次移位全部完成。即一个8bit字节处理完毕;
6、重复第2至第5步,即依次处理后面的数据字节,直到全部数据处理完成;
7、最终CRC寄存器里的内容即为CRC值。
**/
unsigned short usNorCRC16(unsigned char *buf, unsigned short len){
unsigned short crc,data,val;
unsigned char i;
crc = 0xFFFF;
while(len-- > 0){
unsigned char i = 8;
crc = *buf ^ crc;
while(i-- > 0){
if (crc & 0x1){
crc >>= 1;
crc ^= 0xA001;
}else{
crc >>= 1;
}
}
buf++;
}
return crc;
}
请填写推广理由:
分享
只看
楼主