CRC校验实现的过程说明
(2012-05-16 02:42:04)
对于CRC16校验的算法,我为了方便初学者能直观的了解其计算过程,最近有点时间,特将《从MODBUS到透明就储》中的例子直观的用表格说明的方式把它描述出来,让读者一看就明白。供大家学习参考。 |
多项式CRC16=16x+15x+2x+1(0XA001-RTU标准),假设计算的数是:02,07. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
说明 |
MSB |
LSB |
LSB移出 |
|
这两行异或 |
|
CRC初始化: |
1111 |
1111 |
1111 |
1111 |
|
|
|
|
数据:02 |
0000 |
0000 |
0000 |
0010 |
|
|
|
|
XOR第一个字符= |
1111 |
1111 |
1111 |
1101 |
|
|
这两行异或 |
移位1 |
右移1位 |
0111 |
1111 |
1111 |
1110 |
1 |
|
|
|
多项式 |
1010 |
0000 |
0000 |
0001 |
|
|
|
|
XOR= |
1101 |
1111 |
1111 |
1111 |
|
|
这两行异或 |
移位2 |
右移1位 |
0110 |
1111 |
1111 |
1111 |
1 |
|
|
|
多项式 |
1010 |
0000 |
0000 |
0001 |
|
|
|
|
XOR= |
1100 |
1111 |
1111 |
1110 |
|
|
|
移位3 |
右移1位 |
0110 |
0111 |
1111 |
1111 |
0 |
|
|
|
|
|
|
|
检测LSB移出位,如果是0则不异或再右移1位 |
这两行异或 |
移位4 |
右移1位 |
0011 |
0011 |
1111 |
1111 |
1 |
|
|
|
多项式 |
1010 |
0000 |
0000 |
0001 |
|
|
|
|
XOR= |
1001 |
0011 |
1111 |
1110 |
|
|
|
移位5 |
|
0100 |
1001 |
1111 |
1111 |
0 |
|
这两行异或 |
移位6 |
|
0010 |
0100 |
1111 |
1111 |
1 |
|
|
|
多项式 |
1010 |
0000 |
0000 |
0001 |
|
|
|
|
XOR= |
1000 |
0100 |
1111 |
1110 |
|
|
|
移位7 |
|
0100 |
0010 |
0111 |
1111 |
0 |
|
这两行异或 |
移位8 |
|
0010 |
0001 |
0011 |
1111 |
1 |
|
|
|
多项式 |
1010 |
0000 |
0000 |
0001 |
|
|
|
|
XOR= |
1000 |
0001 |
0011 |
1110 |
|
|
第一个数据:02处理完毕 |
|
|
下面处理第二个数据:07,将CRC寄存器中处理好的数据与07异或 |
这两行异或 |
|
|
1000 |
0001 |
0011 |
1110 |
|
|
|
|
07 |
0000 |
0000 |
0000 |
0111 |
|
|
|
|
XOR= |
1000 |
0001 |
0011 |
1001 |
|
|
这两行异或 |
移位1 |
|
0100 |
0000 |
1001 |
1100 |
1 |
|
|
|
多项式 |
1010 |
0000 |
0000 |
0001 |
|
|
|
|
XOR= |
1100 |
0000 |
1001 |
1101 |
|
|
|
|
...... |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
运算同02的数据处理,其结果是: |
|
|
|
|
|
|
|
0001 |
0010 |
0100 |
0001 |
则该帧数据的CRC16为:4112 |
|
|
|
|
|
|
|
读者可以用CRC软件(可用曾子琪的多功能串口调试软件进行计算)校验下该CRC码的正确性,然后自己依据上述表格中的格式去计算,这样对整个过程就明白了。也就明白CRC怎么校验一组数据的了