CRC算法及C语言实现

楼主
CRC算法及C语言实现
   附件中是“CRC算法及C语言实现.pdf”
   [img]../images/fileType/pdf.gif[/img]此主题相关文件 [url=../../upload/2006/05/06/184437.pdf]184437.pdf[/url]
1楼
生成多项式为G(x),这个G(x)是怎么来得,好像发送序列和接受序列都用到了G(x),谁能告诉我
2楼
呵呵,明白了,在这个表里,是根据数据序列的位数不同而有不同的G(x)
 
 CRC-4
  x4+x+1

 
 CRC-12
  x12+x11+x3+x+1
   
   
 CRC-16
  x16+x12+x2+1

 
 CRC-ITU**
  x16+x12+x5+1
 
 CRC-32
  x32+x26+x23+...+x2+x+1
 
 CRC-32c
  x32+x28+x27+...+x8+x6+1
3楼
看了一下CRC的算法,当有所领悟的时候,简单总结了一下,澄清一下文档中难以理解的地方。用它的例子重新表述一下:
比如要发送4位数据串:1100,所以k=4;P(x)=x3+x2
而r就是多项式最高次幂,即r=3。
将P(x)左移r(=3)位 + R(x) 就是要发送的带校验码的数据串。
R(x)怎么得出呢,首先需要知道G(x):CRC-4 多项式为G(x)= x4+x+1 ,即:1011;
发送方编码方法:将P(x)乘以2r(即对应的二进制码序列左移r位),再除以G(x),所得余式即为R(x)。所以1100 000 /1011 = 1110余010,所以R(x)=010,占r(=3)位。
所以最后发送的字符串就是1100 000 + 010 = 1100 010
              1110
            -------  
      1011 /1100000    
            1011
            ----
             1110
             1011
             -----
              1010
              1011
              -----
               0010
               0000
               ----
                010

收到这串数据后,如果传输无误,则该串数据/G(x)没有余数,也就是1100 010 / 1011可以除尽。否则就认为有误码。

以上数据串所用的除法是:模2减运算法则,既是不带进位和借位的按位减法,举例来看,1100-1011 = 0111,可以发现,这种运算其实是一种按位异或运算。所以编程就相对容易一些了。
4楼
利用CRC进行检错的过程可简单描述为:在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的 r位监督码(CRC码) ,附在原始信息后边,构成一个新的二进制码序列数共k+r位,然后发送出去。在接收端,根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。这个规则,在差错控制理论中称为“生成多项式”。
5楼
为什么对CRC校验这么关心呢,因为在RS-485通讯中要用Modbus协议,这个协议如果使用RTU模式时要对每帧数据进行CRC校验,所以要想看懂人家的代码,就对对他的原理十分了解了。
使用RTU模式,消息包括了一基于CRC方法的错误检测域。CRC域检测了整个消息的内容。
CRC域是两个字节,包含一16位的二进制值。它由传输设备计算后加入到消息中。接收设备重新计算收到消息的CRC,并与接收到的CRC域中的值比较,如果两值不同,则有误。
CRC是先调入一值是全“1”的16位寄存器,然后调用一过程将消息中连续的8位字节各当前寄存器中的值进行处理。仅每个字符中的8Bit数据对CRC有效,起始位和停止位以及奇偶校验位均无效。
CRC产生过程中,每个8位字符都单独和寄存器内容相或(OR),结果向最低有效位方向移动,最高有效位以0填充。LSB被提取出来检测,如果LSB为1,寄存器单独和预置的值或一下,如果LSB为0,则不进行。整个过程要重复8次。在最后一位(第8位)完成后,下一个8位字节又单独和寄存器的当前值相或。最终寄存器中的值,是消息中所有的字节都执行之后的CRC值。
CRC添加到消息中时,低字节先加入,然后高字节。

电脑版 Page created in 0.1719 seconds width 5 queries.