目录
一、简单说校验
1.定义
在车载总线中传输数据时,为了保证传输数据的正确性,会通过一些方法来校验数据是否正确,比如在CAN报文中常见的校验和信号(checksum)以及后面会讲到的CRC(循环冗余校验)。
2.没有校验会怎么样?
小红说:“明天一起坐飞机。”
小明回答:“啥?明天去修拖拉机?”
二、校验和的简单示例
1.以基本的CAN报文格式(DLC=8)进行举例:
假设Byte0 为报文的checksum,Byte1~7为报文中包含的数据,如下表
Byte0 | Byte1 | Byte2 | Byte3 | Byte4 | Byte5 | Byte6 | Byte7 |
checksum | Data | Data | Data | Data | Data | Data | Data |
每个字节的位顺序如下表
bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
校验方式:
计算时按Byte1~7的顺序逐次相加,每当结果超出8bits时,将因为进位出现的1放到bit0的位置。
2.以下选取一段数据实际计算:
数据:0x4A 55 93 E5 11 12 E3,需要按照上述校验方式计算他们的校验和。
过程如下:
0x4A = 0100 1010
0x55 = 0101 0101
————————————
1001 1111 = 0x9F
0x93 = 1001 0011
————————————
1 0011 0010 = 0x132
0011 0011 = 0x33 ——进位出现的1转到bit0的位置
0xE5 = 1110 0101
————————————
1 0001 1000 = 0x118
0001 1001 = 0x19 ——进位出现的1转到bit0的位置
0x11 = 0001 0001
————————————
0010 1010 = 0x2A
0x12 = 0001 0010
————————————
0011 1100 = 0x3C
0xE3 = 1110 0011
————————————
1 0001 1111 = 0x11F
0010 0000 = 0x20 ——进位出现的1转到bit0的位置,然后与原有的1相加进位
0xFF = 1111 1111
————————————
1101 1111 = 0xDF ——与0xFF异或,得到checksum的值
三、CRC介绍
1.定义
CRC:循环冗余校验。
该方法简单地说就是把要传输的数据看作一个整体,将其当作被除数A,再定义一个除数B,通过A/B得到余数C,这个余数C就是这段数据的校验值。
当然CRC算法中还包括很多参数,此处只是作为一个简单的介绍,便于快速理解CRC。
2.参数名词
主要有几个名词:多项式公式、多项式简记式、数据宽度、初始值与结果异或值、输入值反转、输出值反转、参数模型。
1)多项式公式:POLY,它是CRC校验使用的除数,一般使用多项式表示。
注:POLY可以从国际标准中选择,也可以自己指定,原则是保证最高位和最低位=1.
e.g. 多项式:x^8+x^4+x^3+x^2+1=1 0001 1101(bin)=0x11D(hex)
2)多项式简记式:多项式的首位必定为1,而这1的位置在下一步计算一定为0,所以就把前面这个1给省略掉了,出现了一个叫简记式的东西。
e.g. 多项式:x^8+x^4+x^3+x^2+1的简记式=0x11D去掉首个1=0x1D。
3)数据宽度:CRC校验码的所占的位数,CRC长度始终要比除数位数少1。
e.g. CRC-8的数据宽度=8,其POLY=9bites;同理CRC-16的数据宽度=16,其POLY=17bites.
4. 初始值与结果异或值:(均为≠0的情况,因为=0时,数被异或后仍等于自己)
1)明确初始值且该值≠0的情况下,数据在进行计算之前,需要先将要待计算的首字节与初始值进行异或,然后再与多项式进行计算。
2)明确结果异或值且该值≠0的情况下,需要将计算得到的结果与结果异或值进行异或,得到的最终值才是这段数据的CRC校验码。
e.g. 初始值与结果异或值的例子通过后面具体数据来解释。
5. 输入值反转与输出值反转:(均为=True的情况,因为=False时,不进行处理)
1)输入值反转的意思是在计算之前先将数据反转,然后再用得到的反转数据和多项式进行计算。
e.g. 假设数据为0xAA=1010 1010,反转后=0101 0101=0x55,CRC结果为0x73=0111 0011。
2)输出值反转则是将最终得到的CRC结果进行反转。
e.g. 将上述CRC结果再反转,最终得到所需要的结果1100 1110=0xCE。
*注意:通常,输入值反转的情况下,结果值也会是反转的,所以这两个选项一般是同时选中的。
四、异或和模2除法
1.异或
简单说就是:相同为0,不同为1,运算符号是^。
e.g. 0^0=0、0^1=1、1^1=0、1^0=1
2.模2除法
相较普通的算术除法,主要的区别在它既不向上位借位,也不比较除数和被除数的相同位数值的大小,只要以相同位数进行相除即可。