CRC-16(循环冗余错误校验)
冗余循环码(CRC)包含2个字节,即16位二进制。CRC码由发送设备
计算,放置于发送信息的尾部。接收信息的设备再重新计算接收到信
息的CRC码,比较计算得到的CRC码是否与接收到的相符,如果两者不
相符,则表明出错。
在进行CRC码计算时只用8位数据位。起始位、停止位、奇偶校验
位都不参与CRC码计算。
计算CRC码的步骤为:
① 预置16位寄存器为十六进制FFFF(即全为1)。称此寄存器为CRC寄
存器。
② 把第一个8位数据与16位CRC寄存器的低位相异或运算,把结果
放于CRC寄存器。
③ 把寄存器的内容右移一位,用0填补最高位,检查最低位。
④ 如果最低位为0:重复第3步,再次右移一位;如果最低位为1
:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或运算。
⑤ 重复步骤③和④,直到右移8次,这样整个8位数据全部进行了
处理。
⑥ 重复步骤②到⑤,进行下个8位数据的处理。
⑦ 最后得到的CRC寄存器的值即为CRC码。
⑧ 将CRC码分成高8位和低8位,按低位在先,高位在后,将它们
加到传送数据之后。
直接法生成代码:
unsigned short crc_16(unsigned char *Array, unsigned char *Rcvbuf,unsigned int Len)
{
unsigned int IX,IY,CRC;
CRC=0xFFFF;//set all 1
if (Len<=0)
CRC = 0;
else
{
Len--;
for (IX=0;IX<=Len;IX++)
{
CRC=CRC^(unsigned int)(Array[IX]);
for(IY=0;IY<=7;IY++)
{
if ((CRC&1)!=0 )
CRC=(CRC>>1)^0xA001;
else
CRC=CRC>>1; //
}
}
}
Rcvbuf[0] = (CRC & 0xff00)>>8;//高位置
Rcvbuf[1] = (CRC & 0x00ff); //低位置
CRC= Rcvbuf[0]<<8;
CRC+= Rcvbuf[1];
return CRC;
}
0xA001是怎么出来的那,是仪表固化的吗??