16位CRC校验码计算程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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; }