計算CRC-16循環冗余校驗碼的C51程序
一、計算步驟:
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程序,完全可以直接用到編程中去。希望能夠對同行有所幫助。http:www.mangadaku.com/news/2008-2/200824112244.html

