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) 运行效果 图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)
|