第2章数据通信中常用的数据校验算法本章主要内容包括:校验和算法的基本原理奇偶校验算法的基本原理CRC校验算法的基本原理CRC算法的软件实现本章介绍常用校验算法的基本原理,包括校验和、奇偶校验和CRC校验,并介绍了CRC 校验的软件实现方法。
本章的数据校验算法是在数据通信中常用的检测数据错误的方法,在设计单片机的通信中可选用。
2.1 概述数据在传输的过程中,会受到各种干扰的影响,如脉冲干扰,随机噪声干扰和人为干扰等,这会使数据产生差错,数据通信系统模型如图2.1。
为了能够控制传输过程的差错,通信系统必须采用有效措施来控制差错的产生。
数据干扰数据+干扰图2.1 数据通信系统模型常用的差错控制方法让每个传输的数据单元带有足以使接收端发现差错的冗余信息,这种方法不能纠正错误,但可以发现数据错误,这种方法容易实现,检错速度快,可以通过重传使错误纠正,所以是非常常用的检错方案。
在种方案中常用的校验方法有奇偶校验、CRC(循环冗余校验)和校验和,下面分别介绍这三种校验算法。
2.2 奇偶校验算法1、原理奇偶校验算法可分为奇校验和偶校验两种,二者原理相同。
在偶校验中,无论数据位有多少位,校验位只有1位,它使码组中“1”的个数为偶数,要满足如下关系式20021=⊕⊕⊕⊕--a a a n n式中,0a 为校验位,其它位为信息位,⊕表示模2加运算。
在接收端,按照上式将码组中各位进行模2加,若结果为“1”,就让我传输中有错误;若为“0”,就认为无错。
奇校验算法与偶校验算法类似,只是奇校验要满足如下关系式1021=⊕⊕⊕⊕--a a a n n 二者的校验能力相同,均能检测出奇数个错误,而对出现的偶数个错误不能检测出来。
奇偶校验算法是数据通信中最常用的校验方法,在实际应用中,它分为垂直奇偶校验、水平奇偶校验和垂直水平奇偶校验。
2、垂直水平奇偶校验 垂直水平奇偶校验也称为二维奇偶校验或方阵校验,其检错能力要比普通的奇偶校验强。
该校验方式把数据编码排列成矩阵,根据奇偶校验原理,在垂直和水平两个方向同时进行校验。
图2.2是一个垂直水平校验的例子,最下面一行和最右一列为校验位。
发送时按列序顺次传输:01110010011100100111010000110000 。
这种校验方式能检测码组中出现的全部奇数个差错和大部分偶数个差错。
图2.2中△标出的差错能检测出来,但〇标出的差错同时出现时检测不出来,即所有矩形差错检测不出来。
显然,垂直水平奇偶校验编码具有良好的检错能力,同时,还能纠正一些错误,如△标出的错误可以得到纠正。
这种校验方法实现容易,应用广泛。
2.3 校验和校验和也是一种常用的校验方法,它基于冗余校验。
下面介绍其原理。
发送端将数据单元分成长度为n (通常是16)的比特分段,这些分段相加,其结果仍然为n 比特长。
先求和然后取反,作为校验字段附加到数据单元的末尾。
带有校验和字段的数据通过网络传输,其过程如下。
发送端:• 数据单元被分成k 段,每段n 比特; • 将所有段相加求和; • 对和取反得到校验和;0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 0 0 1 1 0 0 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 图2.2 垂直水平奇偶校验• 将校验字段附加到数据单元的末尾与数据一起发送。
接收端:• 将接收数据分成长度为n 比特的段; • 将所有段相加求和; • 对和取反;• 如果结果为0,则接收数据正确,否则数据错误,拒绝接收。
下面举例说明校验和的校验过程。
假定要发送端数据为1010100100111001,采用8位校验和。
首先将数据按8位分段,然后相加求和发送端的发送数据为:10101001 0011100100011101。
若接收端无差错接收发送序列,对其分段、求和、取反:结果全为0,表明接收数据正确。
假设数据产生错误,接收数据变为10101111 1111001 00011101,粗体为错误位。
将三段数据相加:结果部全为0,表明接收数据不正确。
若分段对应位上具有相反值得比特错误,如变为00011101,粗体为错误位。
00101001 10111001同样计算,结果为0,故不能检测这种错误。
显然,该校验方法能检测所有奇数个错误和大多数偶数个错误。
但是,如果某一段中断一个或多个比特被破坏,并且在下一个分段中具有相反值得对应未也被破坏,则这些列的和1 0 1 0 1 0 0 1 + 0 0 1 1 1 0 0 1 1 1 1 0 0 0 1 0 0 0 0 1 1 1 0 1 取反得校验和 1 0 1 0 1 0 0 1 0 0 1 1 1 0 0 1 + 0 0 0 1 1 1 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 取反 1 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 + 0 0 0 1 1 1 0 1 1 1 1 0 0 0 1 0 1 + 1 1 1 0 0 0 1 1 0 0 0 1 1 1 0 0 1 取反 0 0 1 0 1 0 0 11 0 1 1 1 0 0 1 + 0 0 0 1 1 1 0 1 1 1 1 1 1 1 1 10 0 0 0 0 0 0 0取反4将不变,因此接收端检测不出这些错误,也就是说,一个比特的反相被另一个分段对应位上具有相反值得比特反相所抵消,该差错对于校验和来说是不可检测的。
2.4 循环冗余校验(CRC )的原理以上两种校验实现简单,但检错能力有限,常用于要求不高的场合。
CRC 校验能力较强,容易实现,是目前广泛应用的一种检错编码。
下面介绍CRC 校验的基本原理。
对于任一个二进制序列,都可以表示为以x 为基的多项式,例如:124+++x x x多项式的系数对应着二进制数10111。
这就是以多项式的系数表示二进制序列的方法。
所以,长度为n 的码组可以用一个x 的n -1次多项式来表示,码组中每位码的数值就是n -1次多项式中相应项的系数值,这个对应的多项式就是数据多项式。
在发送端,将要发送端数据比特序列作为一个多项式)(x T 的系数,并选定一k 次幂的生成多项式)(x G 。
用k x 乘)(x T ,得kx x T )(。
然后用)(x G 除kx x T )(,得一个余数多项式)(x R 。
此时,将余式多项式附加到数据多项式)(x T 之后,将该序列发送到接收端。
在接收端用同一生成多项式)(x G 去除接收序列多项式kx x T )(',得到计算余式多项式)('x R 。
如果计算余式多项式)('x R 与发送端余式多项式)(x R 相同,则表示传输正确;反之,表示有错。
CRC 校验的生成多项式)(x G 的结构与检错效果是经过严格的数学分析和实验后确定的有相应的国际标准,例如,表2.1列出4种CRC 校验算法的生成多项式,需要时刻从中选择。
CRC 校验过程可概括如下:(1)在发送端,将待发送端数据的多项式)(x T 乘以kx ,其中k 为生成多项式)(x G 的最高幂次,对于二进制乘法,kx x T )(意味着将)(x T 对应的发送数据序列左移k 位。
(2)将kx x T )(除以生成多项式)(x G ,得)()()()()(x G x R x Q x G x x T k += (2.1)式中,)(x Q 为商,)(x R 为余数多项式。
(3)将)()(x R x x T k+所对应的比特序列作为一个整体传输到接收端。
(4)在接收端,对接收序列所对应的多项式kx x T )('进行同样的运算,即)()(')()()('x G x R x Q x G x x T k += (2.2)得到余式多项式)('x R 。
1+++++x x x x x CRC-16 121516+++x x x CRC-CCITT 151216+++x x xCRC-321245781011121622232632++++++++++++++x x x x x x x x x x x x x x(5)比较两个余式多项式)(x R 和)('x R 。
若)(')(x R x R =,则认为传输正确,若)(')(x R x R ≠,则认为传输错误。
实际的CRC 校验码的生产是采用二进制模2计算得到的,也就是异或操作。
在实际应用中,CRC 码的生成与校验过程可用软件或硬件来实现,目前,已有很多的通信集成电路芯片本身带有标准的CRC 码产生和校验功能,使用方便。
2.5循环冗余校验(CRC )的软件实现如前所述,CRC 校验技术广泛应用于测控及通信领域。
而且CRC 计算可以靠专用的硬件来实现,但是对于低成本的微控制器系统,在没有硬件支持下实现CRC 检验,要通过软件来实现CRC 计算。
本节将介绍三种算法,第一种适用于程序空间十分苛刻但CRC 计算速度要求不高的微微控制器系统,第二种适用于程序空间较大且CRC 计算速度要求较高的计算机或微控制器系统,最后一种是适用于程序空间不太大,且CRC 计算速度又不可以太慢的微控制器系统。
本节只介绍16位CRC 码的产生。
1、按位计算CRC 码对于一个二进制序列数可以表示为式(2.3):01111)(T x T x T x T x T n n n n +⋅++⋅+⋅=--(2.3)求此二进制序列数的CRC 码时,先乘以16x 后(既左移16位),再除以多项式)(x G ,所得的余数即是所要求的CRC 码。
移位后的表达式如式(2.4)所示:)()()()()()(16016111611616x G x T x x G x T x x G x T x x G x T x G x x T n n n n ⋅+⋅++⋅⋅+⋅⋅=⋅--(2.4)可设:)()()()(16x G x R x Q x G x T n n n +=⋅ (2.5) 其中)(x Q n 为整数,)(x R n 为16 位二进制余数。
将式(2.5)代入式(2.4)得:)()()()()()()()(160161116116x G x T x x G x T x x G x T x x G x R x Q x G x x T n n n n n ⋅+⋅++⋅⋅+⋅⎭⎬⎫⎩⎨⎧+=⋅-- )()()()()()(1601611161x G x T x x G x T x x G x T x G x x R x x Q n n n nn ⋅+⋅++⋅⎭⎬⎫⎩⎨⎧⋅++⋅=-- (2.6) 再设:)()()()()()(11161x G x R x Q x G x T x G x x R n n n n ---+=⋅+ (2.7)其中)(1x Q n -为整数, )(1x R n -为16位二进制余数,将式(2.7)代入式(2.6),如上类推,最后得到:)()()()()()()()(0011116x G x R x Q x x Q x x Q x x Q x G x x T n n n n ++⋅++⋅+⋅=⋅-- (2.8)根据CRC 的定义,)(0x R 即为余式多项式,其系数是我们要求的CRC 码。