crc校验方法及示例,crc校验

 CRC校验简介

 CRC即循环冗余校验码(Cyclic Redundancy Check[1] ):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。

 CRC应用场合

 CRC校验实用程序库 在数据存储和数据通讯领域,为了保证数据的正确,就不得不采用检错的手段。在诸多检错手段中,CRC是最著名的一种。CRC的全称是循环冗余校验,其特点是:检错能力极强,开销小,易于用编码器及检测电路实现。从其检错能力来看,它所不能发现的错误的几率仅为0.0047%以下。从性能上和开销上考虑,均远远优于奇偶校验及算术和校验等方式。因而,在数据存储和数据通讯领域,CRC无处不在:著名的通讯协议X.25的FCS(帧检错序列)采用的是CRC-CCITT,WinRAR、NERO、ARJ、LHA等压缩工具软件采用的是CRC32,磁盘驱动器的读写采用了CRC16,通用的图像存储格式GIF、TIFF等也都用CRC作为检错手段。下面介绍硬件生成与计算CRC的过程。

 CRC16硬件生成过程

 下面以最常用的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寄存器。

 3.CRC寄存器向右移一位,MSB补零,移出并检查LSB。

 4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。

 注意:该步检查LSB应该是右移前的LSB,即第3步前的LSB。

 5.重复第3与第4步直到8次移位全部完成。此时一个8-bit数据处理完毕。

 6.重复第2至第5步直到所有数据全部处理完成。

 7.最终CRC寄存器的内容即为CRC值。

 关于CRC-16校验

 概要

 关于CRC-16生成多项式用X3+X2+1那样的X的乘数的表示形式,来代替二进制代码1101的表述。生成多项式若为素多项式就可以,为了使出错检测最优化,可以定义和提出几个标准生成多项式。RTU protocol采用与二进制代码1 1000 0000 0000 0101对应的生成多项式(X16+X15+X2+1)。这时生成的CRC为CRC-16。

 算法

 在下页的图3.1中表示了CRC-16的计算算法。请结合后面所示的计算例一起进行理解。 该图为在发送侧进行CRC数据的计算,最终作为检查代码附加在发送帧中。 接收处理也采用同一算法。但是还包括把在接受侧计算的CRC 数据和发送的CRC数据进行比较的处理。


 计算例

 读出的发送数据例

 站号1,FC = 3,功能代码P02 (P为03 H,02为02H),读出数据数20个,GP为生成多项式(1010 0000 0000 0001)



 通过以上的计算,发送数据为如下所示。

 帧长计算

 为了计算CRC-16,必须知道可变长的消息长度。所有消息类型的长度可以由表3.14应答消息长度来决定。

相关推荐

相关文章