CRC-16 循环冗余校验:1 + x2 + x 15 + x 16
产生CRC的过程:
1.把16位CRC寄存器置成FFFFH.
2.第一个8位数据与CRC寄存器低8位进行异或运算,把结果放入CRC寄存器。
3.CRC寄存器向右移一位,MSB填零,检查LSB.
4.(若LSB为0):重复3,再右移一位。
(若LSB为1):CRC寄存器与0xA001进行异或运算
5.重复3和4直至完成8次移位,完成8位字节的处理。
6.重复2至5步,处理下一个8位数据,直至全部字节处理完毕。
7.CRC寄存器的最终值为CRC值。
8.在发送时CRC低8位先发,高8位在后。
uint mb_crc16(uchar *np,uchar nlen) // 计算crc16校验: 数据、字节数
{
uchar nxh;
uint ncrc =0xFFFF; // crc初值
while(nlen--)
{
ncrc^=*np++; // crc低字节和数据的一个字节异或
for(nxh=0;nxh<8;nxh++)
{
if (ncrc & 0x0001) { ncrc>>=1; ncrc^=0xA001;} // 检查crc最低位是1,右移一位后异或0xA001
else { ncrc>>=1; } // 是0,直接右移一位
}
}
return (ncrc); // 返回crc
}
在modbus通信程序中
...
ncrc=mb_crc16(数组,字节数); // 计算crc
数组[字节数++]=ncrc; // crc低字节
数组[字节数++]=ncrc>>8; // crc高字节
...
帖子下方相关下载,已经把有关资料列出来哦
|