找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2140|回复: 0
收起左侧

CRC校通用型验算法

[复制链接]
ID:505284 发表于 2020-9-26 23:41 | 显示全部楼层 |阅读模式
CRC校通用型验算法
1、CRC校验简单原理
CRC校验方法是在通讯领域应用极广的一类数据校验方法,常用的包括CRC8、CRC16、CRC32(数字为生成多项式Gx-1),在嵌入式领域应用较多(DS18B20温度传感器正负温度精度校验(CRC查表法)),其校验手段极为有效,但是其本生并不具有纠错能力。假设有目前有效数据Kx(信息码)有K位,生成多项式为Gx,经过有限次取模运算(等同于XOR,不借位的模2运算),求得冗余码(FCS序列)有N位,则最终传输数据为Tx=Kx+N,而接收方在收到数据后用Tx%Gx(有限次XOR)是否为0判断数据传输的正确性。
具体CRC校验原理,还可以参看其他博客或者百度了解学习。
2、算法
经过上述的简单说明,应该知道可以引入Kx、Gx、Tx、Rx,采用最高位对其(Gx补偿)直接计算法,对数据比特串较短、时间要求不高的可以采用,使用必须要满足以下要求:
Gx补偿位数满足:Gx*2^(sizeof(Kx)-sizeof(Gx))。
运算次数满足:sizeof(Kx)-sizeof(Gx)。
CRC进行XOR运算满足:CRC & (2^(sizeof(Kx)-1)。
Rx还原满足:CRC/(2^(sizeof(Kx)-sizeof(Gx)+1)。
其中sizeof表示取得元素在二进制下位长。
3、应用效果
(1) 测试数据:
Kx=110011,Gx=11001,Rx=1001
Kx=101001,Gx=1101,Rx=001
(2) 运行效果   
                         d0f2d641861b4133ae78da8340862f67.png
                                         图3.1        测试1
4、说明
首先,为什么我要大费周章的开发这样一个程序呢?原因其实很简单,网络上关于CRC校验的原代码的确是很多,原理更是不计其数,但是有三点需要注意,其一,CRC校验是有很多标准(CRC—16/IBM、CRC-8等)的,而这些标准的区别就在于采用的生成多项式不同,比如说CRC-8的Gx为:X^8+X^2+X+1(100000101,注意最高位和最低位为1),这就会造成你的直接引用却无法得到预期的结果,在者CRC校验本身并不难,而难的是如何用计算机实现,因为你要考虑很多因素,最多的就是数据边界问题(char类型数据在Keil 5中容纳数据为255),这个自己体会了;其二,当你去不断参考别人的经验代码的时候,你会发现这样一句话“CRC为嵌入式开发人员的法宝之一,但仅有少数人能掌握其核心算法!”,真的有这么难吗,前辈的答案显然是正确的,当你浏览很多个码龄超过4年以上的前辈的代码后你会发现,难于理解,因为数学思维极强,最后结果就会是直接不想看甚至放弃了,但是我编写的则不同,简单,易于理解,起源于谢希仁计网,通用型极高;其三,纯属个人爱好,还有就是特别讨厌直接引用别人代码,而不知所云(可能是个人强迫症),以及编写过后对收获成果的一种成就感促使我这么做。
还有一点需要说明的是,从图3.2可以看出,最后的Tx是错误的,原因是C98编译器只统计数据的有效位,原Rx=001,有效数据为1,所以00被丢弃了,造成Kx%Gx出错,这个是我故意留于检测用,改正仅需加入2个0即可。
最后,我的成功是站在巨人的肩膀上的,我姑且这么说吧,模型参考了一位前辈的,但是前辈的核心思想有问题,其核心是自己总结的,这篇博客将会是我在CSDN的“LHC_黎明之光”博客号首次原创文章,前路漫漫,望我们一同成长学习吧!如果发现错误的话,欢迎给我留言哦。

以上文档: 通用CRC校验算法.docx (110.84 KB, 下载次数: 8)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表