我要找:  
您的位置:电源在线首页>>行业资讯>>交流培训>>计算CRC-16循环冗余校验码的C51程序正文

计算CRC-16循环冗余校验码的C51程序

2008/2/4 11:22:44   深圳市诺顺科技有限公司  供稿
分享到:

一、计算步骤:

1、定义一个初始值为FFFF的16位的组合变量(regs),该变量称为CRC寄存器。

2、把欲发送或接收消息的高8位和CRC寄存器的底8位作异或运算,并把结果在赋到CRC寄存器。

3、CRC寄存器右移1位(朝最低位),同时最高位添零。取出并检查最低位是否为1。

4、如果为1,则CRC寄存器与多项式A001异或;如果为0,则重复第3步的动作。

5、重复3和4直到完成了8次移位。这样完整的8位字节将完成处理了。

6、对于下一个8位字节的处理就是重复第2步到第5步了

7、把所有的欲发送或接收消息这样处理后,CRC寄存器里的值就是我们最终需要得到的CRC校验码(在result中)。

二、C51源程序

/*CRC数组计算程序*/

#include <stdio.h>

typedef unsigned char uchar;//定义简写类型

typedef unsigned short u16;//定义简写类型

u16 result;//放计算后的CRC结果值

u16 len=6;//参与计算的数组个数(不包括CRC两子节)

//数组1

//uchar ppp[]={0xFF,0x03,0xC0,0x21,0x04,0x03,0x00,0x07,0x0D,0x03,0x06};

//CRC高节=0x9b,CRC低节=0x03,即result=0x9B03  len=11

//数组2

uchar ppp[]={0x64,0x03,0x00,0x0A,0x00,0x01};

//CRC高节=0xfd,CRC低节=0xad 即result=0xfdad len=6

//定义组合结构

typedef union

{

    u16 val;

    struct

    {

        u16 bit0 : 1;

        u16 bit1 : 1;

        u16 bit2 : 1;

        u16 bit3 : 1;

        u16 bit4 : 1;

        u16 bit5 : 1;

        u16 bit6 : 1;

        u16 bit7 : 1;

        u16 bit8 : 1;

        u16 bit9 : 1;

        u16 bit10 : 1;

        u16 bit11 : 1;

        u16 bit12 : 1;

        u16 bit13 : 1;

        u16 bit14 : 1;

        u16 bit15 : 1;

    } bits;

} CRCREGS;

CRCREGS regs;

 

u16 CRCCheck(uchar *pp,u16 CRClen)

{

bit a;

int i,j;

regs.val=0xffff;

pp=&ppp[0];

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

 {

  regs.val^=pp[i];

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

   {

    a=regs.bits.bit0;

    regs.val>>=1;   

    if(a) regs.val^=0xA001;

   }

 }

  return regs.val;

}

 

/* 主程序 */

void main()

{

result=CRCCheck(ppp,len);

}

三、简要说明

1、程序中列了两组数,可以做测试用,结果都在注释中,注意 len 的值要与数组的个数相匹配,数组1为11,数组2为6;

2、regs.val是一个共用体变量,该变量既可以作为字用,也可以进行位操作,详细情况请参照变量union和共用和struct结构类型体说明;

3、在主程序中直接调用result=CRCCheck(ppp,len);即可得到CRC-16结果,注意ppp是一个数组变量,在函数中是当成数组变量指针用的。

本人参考了许多资料,通过反复修本人认为是比较精练的C51程序,完全可以直接用到编程中去。希望能够对同行有所帮助。
   免责声明:本文仅代表作者个人观点,与电源在线网无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
本文链接:计算CRC-16循环冗余校验码的C51
http:www.cps800.com/news/2008-2/200824112244.html
  投稿热线 0755-82905460    邮箱  :news@cps800.com
关于该条新闻资讯信息已有0条留言,我有如下留言:
请您注意:
·遵守中华人民共和国的各项有关法律法规
·承担一切因您的行为而导致的法律责任
·本网留言板管理人员有权删除其管辖的留言内容
·您在本网的留言内容,本网有权在网站内转载或引用
·参与本留言即表明您已经阅读并接受上述条款
用户名: 密码: 匿名留言   免费注册会员
关键字:
        
按时间:
关闭