void CalulateCRCbySoft(unsigned char *pucData,unsigned char wLength,unsigned
char *pOutData)
{
unsigned char ucTemp;
unsigned int wValue;
Unsigned int crc_tbl[16]={0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef}; //四 位 余式表
wValue=0;
//本字节的 CRC 余式等于上一字节的 CRC 余式的低 12 位左移 4 位后,
//再加上上一字节 CRC 余式右移 4 位(也既取高 4 位)和本字节之和后所求得的 CRC 码
while(wLength--!=0)
{
//根据四位 CRC 余式表,先计算高四位 CRC 余式
ucTemp=((wValue>>8))>>4;
wValue<<=4;
wValue^=crc_tbl[ucTemp^((*pucData)>>4)];
//再计算低四位余式
ucTemp=((wValue>>8))>>4;
wValue<<=4;
wValue^=crc_tbl[ucTemp^((*pucData)&0x0f)];
pucData++;
}
pOutData[0]=wValue;
pOutData[1]=(wValue>>8);
}