循环冗余码校验原理_第1页
循环冗余码校验原理_第2页
循环冗余码校验原理_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

循环冗余码校验原理 循环冗余码校验英文名称为 Cyclical Redundancy Check,简称 CRC。它是利用除法及 余数的原理来作错误侦测(Error Detecting)的。他将要发送的数据比特序列当作一个多项 式 f(x)的系数,发送时用双方预先约定的生成多项式 G(x)去除,求得一个余数多项式,将 余数多项式加到数据多项式之后发送到接收端,接收端同样用 G(x)去除接收到的数据,进 行计算,然后把计算结果和实际接收到的余数多项式数据进行比较,相同的话表示传输正 确。CRC 校验检错能力强,容易实现,是目前应用最广的检错码编码方式之一。 在国际标准中,根据生成多项式 G(x)的不同,CRC 又可分为以下几种标准: CRC-12 码: G(x)=X12+X11+X3+X2+X+1 CRC-16 码: G(x)=X16+X15+X2+1 CRC-CCITT 码: G(x)=X16+X12+X5+1 CRC-32 码: G(x) =X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+X+1 CRC-12 码通常用来传送 6-bit 字符串。CRC-16 及 CRC-CCITT 码则用是来传送 8-bit 字符,其中 CRC-16 为美国采用,而 CRC-CCITT 为欧洲国家所采用。CRC-32 码大都被采 用在一种称为 Point-to-Point 的同步传输中。下面以最常用的 CRC-16 为例来说明其生成过 程。 CRC-16 码由两个字节构成,在开始时 CRC 寄存器的每一位都预置为 1,然后把 CRC 寄存器与 8-bit 的数据进行异或,之后对 CRC 寄存器从高到低进行移位,在最高位 (MSB)的位置补零,而最低位(LSB,移位后已经被移出 CRC 寄存器)如果为 1,则把 寄存器与预定义的多项式码进行异或,否则如果 LSB 为零,则无需进行异或。重复上述的 由高至低的移位 8 次,第一个 8-bit 数据处理完毕,用此时 CRC 寄存器的值与下一个 8-bit 数据异或并进行如前一个数据似的 8 次移位。所有的字符处理完成后 CRC 寄存器内的值即 为最终的 CRC 值。 下面为 CRC 的计算过程: 1设置 CRC 寄存器,并给其赋值 FFFF(hex)。 2将数据的第一个 8-bit 字符与 16 位 CRC 寄存器的低 8 位进行异或,并把结果存入 CRC 寄存器。 3CRC 寄存器向右移一位,MSB 补零,移出并检查 LSB。 4如果 LSB 为 0,重复第三步;若 LSB 为 1,CRC 寄存器与多项式码相异或。 5重复第 3 与第 4 步直到 8 次移位全部完成。此时一个 8-bit 数据处理完毕。 6重复第 2 至第 5 步直到所有数据全部处理完成。 7最终 CRC 寄存器的内容即为 CRC 值。 二、 循环冗余码校验程序的编写 明白了 CRC 校验码的产生过程,编写起程序来就非常容易了。由于 Visual Basic 的广 泛普及以及其在数据通讯中的重要地位,下面就以 VB 语言来编写 CRC 的生成程序,其它 语言只需稍做修改即可。 编写 CRC 校验程序有两种办法:一种为计算法,一种为查表法。通常使用查表法,尤 其在 VB 程序中,可以大大降低 CPU 的运算时间。下面对两种方法分别讨论。 1计算法 计算法就是依据 CRC 校验码的产生原理来设计程序。其优点是模块代码少,修改灵活, 可移植性好。其缺点为计算量大。为了便于理解,这里假定了三位数据,而多项式码为 A001(hex)。 在窗体上放置一命令按钮 Command1,并添加如下代码: Private Sub Command1_Click() Dim CRC() As Byte Dim d() As Byte 待传输数据 ReDim d(2) As Byte d(0) = 123 d(1) = 112 d(2) = 135 CRC = CRC16(d) 调用 CRC16 计算函数 CRC(0) 为高位 CRC(1) 为低位 End Sub 注意:在数据传输时 CRC 的低位可能在前,而高位在后。 Function CRC16(data() As Byte) As String Dim CRC16Lo As Byte, CRC16Hi As Byte CRC 寄存器 Dim CL As Byte, CH As Byte 多项式码&HA001 Dim SaveHi As Byte, SaveLo As Byte Dim i As Integer Dim Flag As Integer CRC16Lo = &HFF CRC16Hi = &HFF CL = &H1 CH = &HA0 For i = 0 To UBound(data) CRC16Lo = CRC16Lo Xor data(i) 每一个数据与 CRC 寄存器进行异或 For Flag = 0 To 7 SaveHi = CRC16Hi SaveLo = CRC16Lo CRC16Hi = CRC16Hi 2 高位右移一位 CRC16Lo = CRC16Lo 2 低位右移一位 If (SaveHi And &H1) = &H1) Then 如果高位字节最后一位为 1 CRC16Lo = CRC16Lo Or &H80 则低位字节右移后前面补 1 End If 否则自动补 0 If (SaveLo And &H1) = &H1) Then 如果 LSB 为 1,则与多项式码进行异或 CRC16Hi = CRC16Hi Xor CH CRC16Lo = CRC16Lo Xor CL End If Next Flag Next i Dim ReturnData(1) As Byte ReturnData(0) = CRC16Hi CRC 高位 ReturnData(1) = CRC16Lo CRC 低位 CRC16 =

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论