写给嵌入式程序员的循环冗余校验

写给嵌入式程序员的循环冗余校验

ID:39615016

大小:172.00 KB

页数:9页

时间:2019-07-07

写给嵌入式程序员的循环冗余校验_第1页
写给嵌入式程序员的循环冗余校验_第2页
写给嵌入式程序员的循环冗余校验_第3页
写给嵌入式程序员的循环冗余校验_第4页
写给嵌入式程序员的循环冗余校验_第5页
资源描述:

《写给嵌入式程序员的循环冗余校验》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、写给嵌入式程序员的循环冗余校验(CRC)算法入门引导前言CRC校验(循环冗余校验)是数据通讯中最常采用的校验方式。在嵌入式软件开发中,经常要用到CRC算法对各种数据进行校验。因此,掌握基本的CRC算法应是嵌入式程序员的基本技能。可是,我认识的嵌入式程序员中能真正掌握CRC算法的人却很少,平常在项目中见到的CRC的代码多数都是那种效率非常低下的实现方式。其实,在网上有一篇介绍CRC算法的非常好的文章,作者是RossWilliams,题目叫:“APAINLESSGUIDETOCRCERRORDETECTIONALGOR

2、ITHMS”。我常将这篇文章推荐给向我询问CRC算法的朋友,但不少朋友向我抱怨原文太长了,而且是英文的。希望我能写篇短点的文章,因此就有了本文。不过,我的水平比不了RossWilliams,我的文章肯定也没RossWilliams的写的好。因此,阅读英文没有障碍的朋友还是去读RossWilliams的原文吧。本文的读者群设定为软件开发人员,尤其是从事嵌入式软件开发的程序员,而不是专业从事数学或通讯领域研究的学者(我也没有这个水平写的这么高深)。因此,本文的目标是介绍CRC算法的基本原理和实现方式,用到的数学尽量控制

3、在高中生可以理解的深度。另外,鉴于大多数嵌入式程序员都是半路出家转行过来的,不少人只会C语言。因此,文中的示例代码全部采用C语言来实现。作为一篇入门短文,文中给出的代码更注重于示范性,尽可能的保持易读性。因此,文中的代码并不追求最高效的实现,但对于一般的应用却也足够快速了。从奇偶校验说起所谓通讯过程的校验是指在通讯数据后加上一些附加信息,通过这些附加信息来判断接收到的数据是否和发送出的数据相同。比如说RS232串行通讯可以设置奇偶校验位,所谓奇偶校验就是在发送的每一个字节后都加上一位,使得每个字节中1的个数为奇数个

4、或偶数个。比如我们要发送的字节是0x1a,二进制表示为00011010。采用奇校验,则在数据后补上个0,数据变为000110100,数据中1的个数为奇数个(3个)采用奇校验,则在数据后补上个1,数据变为000110101,数据中1的个数为偶数个(4个)接收方通过计算数据中1个数是否满足奇偶性来确定数据是否有错。奇偶校验的缺点也很明显,首先,它对错误的检测概率大约只有50%。也就是只有一半的错误它能够检测出来。另外,每传输一个字节都要附加一位校验位,对传输效率的影响很大。因此,在高速数据通讯中很少采用奇偶校验。奇偶校

5、验优点也很明显,它很简单,因此可以用硬件来实现,这样可以减少软件的负担。因此,奇偶校验也被广泛的应用着。奇偶校验就先介绍到这来,之所以从奇偶校验说起,是因为这种校验方式最简单,而且后面将会知道奇偶校验其实就是CRC校验的一种(CRC-1)。累加和校验另一种常见的校验方式是累加和校验。所谓累加和校验实现方式有很多种,最常用的一种是在一次通讯数据包的最后加入一个字节的校验数据。这个字节内容为前面数据包中全部数据的忽略进位的按字节累加和。比如下面的例子:我们要传输的信息为:6、23、4加上校验和后的数据包:6、23、4、

6、33这里33为前三个字节的校验和。接收方收到全部数据后对前三个数据进行同样的累加计算,如果累加和与最后一个字节相同的话就认为传输的数据没有错误。累加和校验由于实现起来非常简单,也被广泛的采用。但是这种校验方式的检错能力也比较一般,对于单字节的校验和大概有1/256的概率将原本是错误的通讯数据误判为正确数据。之所以这里介绍这种校验,是因为CRC校验在传输数据的形式上与累加和校验是相同的,都可以表示为:通讯数据校验字节(也可能是多个字节)初识CRC算法CRC算法的基本思想是将传输的数据当做一个位数很长的数。将这个数除以

7、另一个数。得到的余数作为校验数据附加到原数据后面。还以上面例子中的数据为例:6、23、4可以看做一个2进制数:000001100001011100000010假如被除数选9,二进制表示为:1001则除法运算可以表示为:可以看到,最后的余数为1。如果我们将这个余数作为校验和的话,传输的数据则是:6、23、4、1CRC算法和这个过程有点类似,不过采用的不是上面例子中的通常的这种除法。在CRC算法中,将二进制数据流作为多项式的系数,然后进行的是多项式的乘除法。还是举个例子吧。比如说我们有两个二进制数,分别为:1101和1

8、011。1101与如下的多项式相联系:1x3+1x2+0x1+1x0=x3+x2+x01011与如下的多项式相联系:1x3+0x2+1x1+1x0=x3+x1+x0两个多项式的乘法:(x3+x2+x0)(x3+x1+x0)=x6+x5+x4+x3+x3+x3+x2+x1+x0得到结果后,合并同类项时采用模2运算。也就是说乘除法采用正常的多项式乘除法,而加减法

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。