crc校验方法及示例

电子常识

2585人已加入

描述

  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的过程。

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数据进行比较的处理。

CRC校验
CRC校验

  计算例

  读出的发送数据例

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

CRC校验
CRC校验
CRC校验

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

CRC校验

  帧长计算

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

CRC校验

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分