这段时间做项目涉及到串口通信的一些东西,串口返回的数据需要进行crc的效验,这块东西原来软考的时候学过.但也只是停留在了解的层面上.完全没有真正的用过,这次要真刀真枪的干了,脑子里是一片空白,就在网上查了点资料.下面是我整理的一些资料,以及自己的一些理解.
首先,照顾一下不了解的朋友,普及一下什么是crc校验:
随着计算机技术的不断发展,在现代工业中,利用微机进行数据通讯的工业控制应用得也越来越广泛。由于传输距离、现场状况等诸多可能出现的因素影响,计算机与受控设备之间的通讯数据常会发生无法预测的错误。为了防止错误所带来的影响,一般在通讯时采取数据校验的办法,而循环冗余码校验是最常用的校验方法之一。在实际使用的各种现场总线协议中,数据帧的校验一般都采用这种检验方式。
简单的说就是一种屏蔽数据在传输过程中出错的方法.
这块内容也就是书上介绍最多的东西,也是最重要的东西。 crc校验采用多项式编码方法。多项式乘除法运算过程与普通代数多项式的乘除法相同。多项式的加减法运算以2为模,加减时不进,错位,如同逻辑异或运算。
把被处理的数据块可以看作是一个n阶的二进制多项式。采用crc校验时,发送方和接收方用同一个生成多项式g(x),并且g(x)的首位和最后一位的系数必须为1(这是规定,没有原因)。crc的处理方法是:发送方以t(x)去除g(x),得到余数作为CRC校验码加在t(x)后。接受方校验时,同样以接收到的数据除以g(x),以计算的校正结果是否为0为据,判断数据帧是否出错
利用生成多项式位k个数据位产出r个校验位来进行编码,其编码长度位k+r,crc的代码格式位:
由此可知,循环冗余校验码是由两部分组成的,左边为信息码(数据)右边为校验码。若信息码占K位,则校验码占n-k位。其中,n为crc码的字长,所以又称为(n,k)码校验位是由信息码产生的,校验码位越长,该代码的校验能力越强。
上面说的有点太专业了。说白了就是两个人要传送一个数字,两人事先说好了。发送来的数据能整除一个数g,这样发送发发送的时候为了保证这个数能整除k需要加上某个数r,接收方接到数据以后需要验证数据是否能整除这个数g,如果不能一定是在传送过程中出现了错误。
crc校验码的编码方法是用待发送的二进制数据t(x)除以生成多项式g(x),将最后的余数作为CRC校验码。其实现步骤如下:
例如:信息字段代码为: 1011001;对应m(x)=x6+x4+x3+1
假设生成多项式为:g(x)=x4+x3+1;则对应g(x)的代码为: 11001
x4m(x)=x10+x8+x7+x4 对应的代码记为:10110010000;
采用多项式除法: 得余数为:1010 (即校验字段为:1010)
发送方:发出的传输字段为: 1 0 1 1 0 0 1 1 0 10
信息字段 校验字段
接收方:使用相同的生成码进行校验:接收到的字段/生成码(二进制除法)如果能够除尽,则正确。
对一个新事物的学习,往往是要进过反复的学习。我们需要做的就只是积累,积极,总结提高!!!