CRC校验的设计与实现.docVIP

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
CRC校验的设计与实现

5.3.4 循环冗余校验的设计与实现 本系统中数据通信技术占据重要地位,是保证数据采集准确性的关键。客户端与称重仪表进行通信时,为减小产量信息在传输过程中由于电磁干扰等因素导致的错误,需进行数据校验。数据校验方法有很多,比较传统的有:行列冗余校验、重复码校验、奇偶校验、循环冗余校验等。 本系统采用循环冗余校验()进行通信过程中的数据校验。是一种检错能力很强的循环码,利用模2取余的原理对数据进行循环校验,计算效率高且误判概率极低,几乎为零。从性能和开销上考虑,远优于传统的算术和校验及奇偶校验。 1.编码原理 校验通常采用多项式编码的方式,参与校验的数据信息(以下简称“待校验数”)可看作一个阶的二进制形式的多项式,即。例如,一个6位二进制数101101可表示为:(为方便下文描述,把该类型的多项式称为“转换多项式”)。 的编码方式是把待校验数转变成二进制数,然后再将转变为转换多项式,令(式中的表示对中括号内的式子进行取余运算),将余数做为待校验数的校验码。 校验码具体求解步骤如下: ①假设待校验数是位二进制形式的多项式,把转变为转换多项式,位数为。在待校验数的末尾附加个零,则待校验数的长度变为位,其对应的二进制形式的多项式变成。 ②把和进行取余运算,设余数为,则,位数为。则就是经过编码后的校验码。 ③把以模2除法的方法求得,然后减去,得到二进制形式的多项式就是包含了CRC校验码的待校验数。 2.解码原理 检验原理是在一个位待校验数后添加个二进制序列,组成一个长度为 位的二进制数据。例如,一个位二进制数据块为,位校验码为,得到的位二进制校验码;附加在位待校验数后的位二进制序列与之间存在一种校验关系。若数据传输过程中因电磁干扰、环境因素等原因造成待校验数中部分数据产生错误,那么这种校验关系就被破坏。所以通过检查此校验关系,即可实现对数据传输准确性的校验。 由编码过程可得,数据接收方接收的位待校验数是码和的组合,去除的最后位数据,就得到原始待校验数。因此,CRC解码过程是对接收的前位数据进行与编码相同的校验,数据通讯双方采用相同的多项式,将校验得到的位校验码与的最后位校验码进行对比,以两者是否一致为依据来检验待校验数在传输过程中是否出错。若两者不同,则待校验数在传输过程中产生错误;若两者相同,则表明待校验数在传输过程中未出现错误。 编码实际上是将位待校验数转变成能够被除尽的位二进制多项式。因此解码过程亦可通过对进行取余运算实现,即:。若余式,则判定数据传输过程中产生错误;反之,则表明数据传输正常。目前,大多数解码电路按照此运算方式进行数据数据传输过程中错误的校验。 常用的校验算法有两种:①查表法,②计算法。本系统设计的校验算法采用第一种方法,具体程序设计如下: CRC校验算法。 crc = (crcTable((((crc And HFF00) / 256) And HFF)) Xor (DataBuf(i) And HFF)) Xor(((crc And HFF) * 256) And HFF00) Private Function CRC16(ByRef DataBuf() As Byte, ByVal LenData As Integer) As Long Dim J, K, L, M, N, O As Long Dim CRC_CHECK As Long Dim i As Integer For i = 0 To GET_DATA_LEN(DATA_REC) - 1 J = (crc And HFF00) / 256 K = i And HFF L = DataBuf(i) And HFF M = J Xor K N = crc_Table(L) O = (crc And HFF) * 256 CRC_CHECK = M Xor N Next i If CRC16 = CRC_CHECK Then Call DATA_SAVE 数据保存 Else Call CHECK_FAILURE 校验失败 Call ERR_HANDLING 错误处理 End If End Function

文档评论(0)

cuotian + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档