16位CRC校验码计算程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/***************************************************************

16位CRC计算方法

1.预置1个16位的寄存器为十六进制FFFF(即全为1);称此寄存器为CRC寄存器;2.把第一个8位二进制数据(既通讯信息帧的第一个字节)与16位的CRC寄存器的低8位相异或,把结果放于CRC寄存器;

3.把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位;4.如果移出位为0:重复第3步(再次右移一位);

如果移出位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;5.重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;

6.重复步骤2到步骤5,进行通讯信息帧下一个字节的处理;

7.将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC;

*****************************************************************/

/****************************************************************************

名称: UART_CRC16_Work()

说明: CRC16校验程序

参数: *CRC_Buf:数据地址

CRC_Leni:数据长度

返回: CRC_Sumx:校验值

*****************************************************************************/

unsigned int UART_CRC16_Work(unsigned char *CRC_Buf,unsigned char CRC_Leni) {

unsigned char i,j;

unsigned int CRC_Sumx;

CRC_Sumx=0xFFFF;

for(i=0;i

{

CRC_Sumx^=*(CRC_Buf+i);//异或

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

{

if(CRC_Sumx & 0x01)

{

CRC_Sumx>>=1;

CRC_Sumx^=0xA001;

}

else

{

CRC_Sumx>>=1;

}

}

}

return (CRC_Sumx);

}

Crc_Length = 9;

for(k=0;k<9;k++)

Crc_Buf[k]=ReceiveBuf[k];

Crc_Value=Crc16(Crc_Buf,Crc_Length);

Crc_ReceiveValue=ReceiveBuf[9];

Crc_ReceiveValue=(Crc_ReceiveValue<<8)+ReceiveBuf[10];

if(Crc_Value==Crc_ReceiveValue) unsigned int Crc16(unsigned char *pBuf, unsigned char num)

{

unsigned char i,j;

unsigned int wCrc = 0xFFFF;

for(i=0; i

{

wCrc ^= (uint)(pBuf[i]);

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

{

if(wCrc & 1){wCrc >>= 1; wCrc ^= 0xA001; }

else

wCrc >>= 1; } }

return wCrc; }

相关文档
最新文档