CRC码是由两部分组成,前部分是信息码,就是需要校验的信息,后部分是校验码,如果CRC码共长n个bit,信息码长k个bit,就称为(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 也就是‘模2减’和‘模2加’直值表完全相同。
有了加减法就可以用来定义模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 ) ;
文章评论(0条评论)
登录后参与讨论