CRC 校验
由于最近要控制一个伺服电机,用到了串口modbus协议,用到的是rtu模式。协议也是起始帧加数据帧加CRC校验。特此系统记录一下crc校验。
CRC概念
首先crc就是一个附在一串报文后面的一个16位二进制的数,由发送设备计算。接受的设备在接收报文后重新计算CRC,然后把这个值和接收到的CRC数据进行对比,如果两个值相等·就校验成功,若两个值不相等,则为错误。
CRC计算方式
CRC的计算,首先对一个16位寄存器预装全1,然后将报文中连续的8位子节对其进行后续的计算。起始位停止位一般不参与CRC计算。
1: 把一个16位寄存器全部装入1,FFFF将这个寄存器称为CRC寄存器。
2: 把报文的第一个八位字节和16位CRC寄存器低字节异或,结果置于CRC寄存器。
3:把CRC寄存器右移一位,MSB充零(最高有效位),提取并检测LSB。
4:如果LSB(最低位)是0则继续第三步,如果是1则对CRC寄存器.
5: 重复3和4两个步骤,直到完成8次移位。
6:对报文中2-5步骤重复,直到所有报文被处理。
7: CRC寄存器中生成最终的CRC校验码
8:当CRC值放在报文中的时候高低字节必须交换位置。
c语言实现CRC校验实例
unsigned char *data;
unsigned char length;
unsigned int crc_chk(unsigned char *data,unsigned char length)
{
int i,j;
unsigned int crc_reg =0xffff;
while(length--)
{
crc_reg^=*data++;
for(j=0;j<8;j++)
{
if(crc_reg&0x01)
{
crc_reg=(crc_reg>>1)^0xa001;
}
else
{
crc_reg=crc_reg>>1;
}
}
}
return crc_reg;
}