计算CRC-16循环冗余校验码的C51程序
|
来源:www.chinaups.com 作者:fei 浏览:167次
发布日期:2008-2-19 9:47:32 一、计算步骤: 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程序,完全可以直接用到编程中去。希望能够对同行有所帮助。 |
|
·上一篇文章:中国半导体照明产业投资论坛在津举行 ·下一篇文章:2008年广东电源学会理事会暨新春座谈会邀请函 |
| 【打印此文】【关闭窗口】 |


