crc16校验c语言单片机实现,三种常用的CRC16校验算法的C51程序的优化

CRC校验又称为循环冗余校验,是数据通讯中常用的一种校验算法。它可以有效的判别出数据在传输过程中是否发生了错误,从而保障了传输的数据可靠性。

CRC校验有多种方式,如:CRC8、CRC16、CRC32等等。在实际使用中,我们经常使用CRC16校验。CRC16校验也有多种,如:1005多项式、1021多项式(CRC-ITU)等。在这里我们不讨论CRC算法是怎样产生的,而是重点落在几种算法的C51程序的优化上。

计算CRC校验时,最常用的计算方式有三种:查表、计算、查表+计算。一般来说,查表法最快,但是需要较大的空间存放表格;计算法最慢,但是代码最简洁、占用空间最小;而在既要求速度,空间又比较紧张时常用查表+计算法。

下面我们分别就这三种方法进行讨论和比较。这里以使用广泛的51单片机为例,分别用查表、计算、查表+计算三种方法计算 1021多项式(CRC-ITU)校验。原始程序都是在网上或杂志上经常能见到的,相信大家也比较熟悉了,甚至就是正在使用或已经使用过的程序。

编译平台采用 Keil C51 7.0,使用小内存模式,编译器默认的优化方式。

常用的查表法程序如下,这是网上经常能够看到的程序范例。因为篇幅关系,省略了大部分表格的内容。

code unsigned int Crc1021Table[256] = {

0x0000, 0x1021, 0x2042, 0x3063,... 0x1ef0

};

unsigned int crc0(unsigned char *pData, unsigned char nLength)

{

unsigned int CRC16 = 0;

while(nLength>0)

{

CRC16 = (CRC16 <>8) ^ *pData) & 0xFF];

nLength--;

pData++;

}

return CRC16;

}

编译后,函数crc0的代码为68字节,加上表格占用的512字节,一共使用了580个字节的代码空间。

下面是常见的计算法的程序:

unsigned int crc2(unsigned char *ptr,unsigned char count)

{

unsigned int crc =0;

unsigned char i;

while(count-- >0)

{

crc = ( crc^(((unsigned int)*ptr)<<8));

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

{

if(crc&0x8000) crc= ((crc<<1)^0x1021);

else crc <<= 1;

}

ptr++;

}

return crc;

}

下面是常见的一种查表+计算的方法:

unsigned  int crc4(unsigned char *ptr,  unsigned char len) {

u

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值