本期话题:
不同嵌入式设备之间进行数据传输时,容易受到外部的干扰导致数据出现错误,如果接收端按照错误数据进行处理,有时会引发不可预知问题。因此,一般会在数据收发过程中添加数据校验,如果校验出错,则不进行后续处理。在制定通信协议的时候,添加数据校验字段,通信双方按照商定的格式对数据进行验证。以此,来保证传输数据的正确性。那么,嵌入式设备之间数据通信,有哪些常用的数据校验算法呢?聊一聊:数据校验过程,是需要发送端和接收端共同完成的。发送端设备按照协议数据包格式,将发送的数据按照校验算法计算出校验字,并添加到协议数据包的既定位置。接收端设备收到数据之后,将接收到的数据按照商定的校验算法计算出校验字,与协议包中携带的校验字进行比较,若相等,则数据包接收正确;否则,丢弃这个数据包。常见的数据校验算法有以下几种:1、BCC校验(异或校验)BCC(Block Check Character,信息组校验码),因校验码是将所有数据异或得出,故俗称异或校验。具体算法是:将每一个字节的数据(一般是每两个16进制的字符)进行异或后即得到校验码。2、校验和把要发送的数据看成 16 比特的二进制整数序列,并计算他们的和。在发送数据时,为了计算数据包的检验和。应该按如下步骤:
把校验和字段设置为0;
把需要校验的数据看成以16位为单位的数字组成,依次进行二进制反码求和;
把得到的结果存入校验和字段中。
在接收数据时,计算数据包的检验和相对简单,按如下步骤:
把首部看成以16位为单位的数字组成,依次进行二进制反码求和,包括校验和字段;
检查计算出的校验和的结果是否为0;
如果等于0,说明被整除,校验和正确;否则,校验和就是错误的,协议栈要抛弃这个数据包。
3、奇偶校验根据被传输的一组二进制代码的数位中“1”的个数是奇数或偶数来进行校验。采用奇数的称为奇校验,反之,称为偶校验。通常专门设置一个奇偶校验位,用它指示这组代码中 “1” 的个数为奇数或偶数。若用奇校验,则当接收端收到这组代码时,校验 “1” 的个数是否为奇数,从而确定传输代码的正确性。简单来说就是:奇校验:使完整编码(有效位和校验位)中的"1"的个数为奇数个;偶校验:使完整编码(有效位和校验位)中的"1"的个数为偶数个。4、CRC校验CRC即循环冗余校验码(Cyclic Redundancy Check)。基本思想是将传输的数据[M(X)] 当做一个位数很长的数。将这个数除以另一个数[G(X)] ,得到的余数[R(X)] 作为校验数据附加到原数据后面,组成循环校验码。
把待编码的N位有效信息位表示为多项式M(X)
把M(X)左移K位,得到M(X)*X^K,这样就空出了K位,以便拼接 K 位余数,这里的 K 位是由多项式G(X)的最高位决定的
选取一个生成多项式G(x),对M(X)*X^K做模二除 (多项式G(X)一般会直接给你,模二除看下面例子,实质是异或运算),以下是运算公式:
( M(X) * X^K ) / G(X) = Q(X) + R(X) / G(X)
这里的Q(X)是商,它本身不重要,这里最重要的是求出余数R(X)。
将信息位M(X)与余数R(X)拼接起来,构成CRC循环冗余校验码。
CRC编码 = M(X) + R(X)