原创 CRC16总结

2009-8-6 16:52 2313 6 6 分类: MCU/ 嵌入式

CRC码是由两部分组成,前部分是信息码,就是需要校验的信息,后部分是校验码,如果CRC码共长nbit,信息码长kbit,就称为(n,k)码。 它的编码规则是:
  1
、首先将原信息码(kbit)左移r(k+r=n)
  2
、运用一个生成多项式g(x)(也可看成二进制数)用模2除上面的式子,得到的余数就是校验码。

  
非常简单,要说明的:模2除就是在除的过程中用模2加,模2加实际上就是我们熟悉的异或运算,就是加法不考虑进位,公式是:
  0+0=1+1=0,1+0=0+1=1
则真,非异则假。
  
由此得到定理:a+b+b=a 也就是22直值表完全相同。

  
有了加减法就可以用来定义模2除法,于是就可以用生成多项式g(x)生成CRC校验码。

例如: g(x)=x4+x3+x2+1,(7,3),信息码110产生的CRC码就是:
             11
11101 | 110,0000
        111 01
          1 0100
          1 1101
            1001
余数是1001,所以CRC码是110,1001<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


 


代码:


       //


// CRC 校验计算程序


// 入口参数: 需要计算 CRC 数据的缓冲区首地址.  需要计算的长度


// 出口参数: 计算得到的 int CRC 结果


//


unsigned  int CRC16(unsigned char *pDatabuf,unsigned char length)


{


 


       unsigned char i;


       unsigned int CRC =0xFFFF;


 


       while ( length >0)


       {


              CRC ^= *pDatabuf;              //异或


              pDatabuf++;                        //下一个数据


 


              for( i =0; i < 8; i++)     


              {


                     CRC >>= 1;                                // CRC校验字节的右移,最低位到C,最高位补0


                     if(CARRY)     CRC ^= 0xA001;   // CARRY 为系统变量名称,进位标志,异或完得到CRC


              }


              length --;                                           //长度-1


       }


 


       return ( CRC);


}


 


CRC_RES = CRC16(g_TxBuf, Sendbytes-2); // 加入 CRC 校验


g_TxBuf[Sendbytes-2] = ( CRC_RES % 256 ) ;    // CRC 结果纳入到 发送队列中


g_TxBuf[Sendbytes-1] = ( CRC_RES / 256 ) ;

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
6
关闭 站长推荐上一条 /3 下一条