CRC-16标准校验算法

转载:http://blog.sina.com.cn/s/blog_c5c2bd470102vfhf.html

错误校验(CRC)域占用两个字节,包含了一个16位的二进制值。CRC值由传输设备计算出来,然后附加到数据帧上,接收设备在接收数据时重新计算CRC,然后与接收到的CRC域中的值进行比较,如果这两个值不相等,就发生了错误。

 

CRC运算时,首先将一个16位的寄存器预置为全1然后连续把数据帧中的每个字节中的8位与该寄存器的当前值进行运算,仅仅每个字节的8个数据位与生CRC,起始位和终止位以及可能使用的奇偶位都不影响CRC。在生成CRC

时,每个字节的8位与寄存器中的内容进行异或,然后将结果向低位移位,高位则用0”补充,最低位(LSB)移出并检测,如果是1,该寄存器就与一个预设的固定值(0A001H)进行一次异或运算,如果最低位为0,不作任何处理。

 

上述处理重复进行,直到执行完了8次移位操作,当最后一位(第8位)移完以后,下一个8位字节与寄存器的当前值进行异或运算,同样进行上述的另一个8次移位异或操作,当数据帧中的所有字节都作了处理,生成的最终值就是CRC

值。

 

生成一个CRC的流程为:

 

1预置一个16位寄存器为0FFFFH(全1),称之为CRC寄存器。

 

2把数据帧中的第一个字节的8位与CRC寄存器中的低字节进行异或运算,结果存回CRC寄存器。

 

3CRC寄存器向右移一位,最高位填以0,最低位移出并检测。

 

如果最低位为0:重复第三步(下一次移位);如果最低位为1:将

CRC寄存器与一个预设的固定值(0A001H)进行异或运算。 

 

重复第三步和第四步直到8次移位。这样处理完了一个完整的八位。

 

重复第2步到第5步来处理下一个八位,直到所有的字节处理结束。

 

最终CRC寄存器的值就是CRC的值。

 例程如下:

例程数据:0x03 0x10 0x00 0x01 0x00 0x08  校验码91ED

int main(int argc, char* argv[])

{

//printf("Hello World!\n");

int i = 0;

int j = 0;

int crc16 = 0xffff;

int data_CRC[6] = {0x03,0x10,0x00,0x01,0x00,0x08};

for (i = 0;i < 6;i++)

{

crc16 = crc16 ^ data_CRC[i];

for (j = 0;j < 8;j++)

{

 

if (crc16 & 0x01)

crc16 = (crc16 >> 1) ^ 0xa001;

else crc16 = crc16 >> 1;

}

}

printf("%X",crc16);

return 0;

 

}

你可能感兴趣的:(工业通讯)