网站大量收购独家精品文档,联系QQ:2885784924

CRC原理的理解与编程.doc

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
CRC原理的理解与编程

CRC原理的理解与编程 CRC校验的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则(例如是CRC-4、CRC-8、CRC-16、CRC-CCITT、CRC-32等标准)产生一个校验用的监督码(既CRC码)r位,并附在信息后边,构成一个新的二进制码序列数共(k+r)位,最后发送出去。在接收端,则根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。16位的CRC码产生的规则是先将要发送的二进制序列数Serial Data左移16位,右面补0(既乘以2^16)后,(4位的CRC码就左移4位,看下面例子)再除以一个生成多项式(就是对应不同CRC标准,有不同的生成多项式,如下表1),最后所得到的余数既是CRC码。 表1 下表中列出了一些见于标准的CRC资料: 名称 生成多项式 简记式* 应用举例 CRC-4 x4+x+1 ?? 3 ITU G.704 CRC-12 x12+x11+x3+x+1 ?? ?? CRC-16 x16+x15+x2+1 8005 IBM SDLC CRC-ITU** x16+x12+x5+1 1021 ISO HDLC, ITU X.25, V.34/V.41/V.42, PPP-FCS CRC-32 x32+x26+x23+...+x2+x+1 04C11DB7 ZIP, RAR, IEEE 802 LAN/FDDI, IEEE 1394, PPP-FCS CRC-32c x32+x28+x27+...+x8+x6+1 1EDC6F41 SCTP * 生成多项式的最高幂次项系数是固定的1,故在简记式中,将最高的1统一去掉了,如04C11DB7实际上是104C11DB7。 ** 前称CRC-CCITT。ITU的前身是CCITT。先举个简单的例子,以CRC-4标准为例,说明CRC编码过程。 设待发送的数据t(x)为12位的二进制数据100100011100;CRC-4的生成多项式为g(x)=x^4+x+1,阶数r为4,即10011(生成多项式中x用1表示)。首先在t(x)的末尾添加4个0构成x^4*t(x),即是左移4位(CRC-16就是左移16位),此后,待发送的数据块变为1001000111000000。然后用g(x)(其值为10011)去除x^4*t(x)(左移4位后的待发送数据) 【实际是XOR异或运算,不是除法】,不管商是多少,只需要求得余数y(x),即为待发送数据对应的CRC值。下表为给出的除法过程: 最后的4位的余数就是待发送数据对应的CRC-4编码。从上面表中可以看出,CRC 编码实际上是一个循环移位的模 2 运算。 对 CRC-4,我们假设有一个 5 bits 的寄存器,通过反复的移位和进行 CRC的除法,那么最终该寄存器中的值去掉最高一位就是我们所要求的余数。所以可以将上述步骤用下面的流程描述: //reg 是一个 5 bits 的寄存器 把 reg 中的值置 0. 把原始的数据后添加 r个 0. While (数据未处理完) Begin If (reg 首位是 1) reg = reg XOR 0011.?? 把 reg 中的值左移一位,读入一个新的数据并置于 register的 0 bit 的位置。 End reg 的后四位就是我们所要求的余数。常见的CRC校验法有3种,直接计算法,查表法,半查表法。下面是几种CRC16的C语言代码,自己理解分析一下 首先是WINAVR中的crc16.h中的库函数(路径在C:\WinAVRavr\include\util\crc16.h) ??? //Optimized CRC-XMODEM calculation. ??? //Polynomial: x^16 + x^12 + x^5 + 1 (0x1021)br ??? //Initial value: 0x0 ??? //This is the CRC used by the Xmodem-CRC protocol. ??? //code ??? uint16_t ??? crc_xmodem_update (uint16_t crc, uint8_t data) ??? { ??????? int i; ??????? crc = crc ^ ((uint16_t)data 8); ??????? for (i=0; i8; i++) ??????? { ??????????? if (crc 0x8000) ??????????????? crc = (crc 1) ^ 0x1021; ??????????? else ??????????????? crc = 1

文档评论(0)

2017ll + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档