第2章常用的数据校验算法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第2章数据通信中常用的数据校验算法本章主要内容包括:

校验和算法的基本原理

奇偶校验算法的基本原理

CRC校验算法的基本原理

CRC算法的软件实现

本章介绍常用校验算法的基本原理,包括校验和、奇偶校验和CRC校验,并介绍了CRC 校验的软件实现方法。本章的数据校验算法是在数据通信中常用的检测数据错误的方法,在设计单片机的通信中可选用。

2.1 概述

数据在传输的过程中,会受到各种干扰的影响,如脉冲干扰,随机噪声干扰和人为干扰等,这会使数据产生差错,数据通信系统模型如图2.1。为了能够控制传输过程的差错,通信系统必须采用有效措施来控制差错的产生。

数据干扰数据+干扰

图2.1 数据通信系统模型

常用的差错控制方法让每个传输的数据单元带有足以使接收端发现差错的冗余信息,这种方法不能纠正错误,但可以发现数据错误,这种方法容易实现,检错速度快,可以通过重传使错误纠正,所以是非常常用的检错方案。

在种方案中常用的校验方法有奇偶校验、CRC(循环冗余校验)和校验和,下面分别介绍这三种校验算法。

2.2 奇偶校验算法

1、原理

奇偶校验算法可分为奇校验和偶校验两种,二者原理相同。在偶校验中,无论数据位有多少位,校验位只有1位,它使码组中“1”的个数为偶数,要满足如下关系式

2

0021=⊕⊕⊕⊕--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 00111001

00011101。

若接收端无差错接收发送序列,对其分段、求和、取反:

结果全为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 1

1 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

取反

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 ,得k

x x T )(。然后用)(x G 除k

x x T )(,得一个余数多项式

)(x R 。此时,将余式多项式附加到数据多项式)(x T 之后,将该序列发送到接收端。在接收

端用同一生成多项式)(x G 去除接收序列多项式k

x x T )(',得到计算余式多项式)('x R 。如果计算余式多项式)('x R 与发送端余式多项式)(x R 相同,则表示传输正确;反之,表示有错。 CRC 校验的生成多项式)(x G 的结构与检错效果是经过严格的数学分析和实验后确定

的有相应的国际标准,例如,表2.1列出4种CRC 校验算法的生成多项式,需要时刻从中选择。

CRC 校验过程可概括如下:

(1)在发送端,将待发送端数据的多项式)(x T 乘以k

x ,其中k 为生成多项式)(x G 的最高幂次,对于二进制乘法,k

x x T )(意味着将)(x T 对应的发送数据序列左移k 位。

(2)将k

x 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)在接收端,对接收序列所对应的多项式k

x 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 x

CRC-32

1245781011121622232632++++++++++++++x x x x x x x x x x x x x x

相关文档
最新文档