📄 crc16.txt
字号:
extern const U16 CRCDATA;
extern U16 RingDetFlag;
/*******************************************CRC校验************************************************/
/************************************************************************************************
*
* 名称: U16 CRC16_CheckBlock(U16 *Ptr,U16 Blen)
* 功能说明:CRC16 块校验
* 调用: 无
* 输入:
* 返回值:
* 备注:
************************************************************************************************/
U16 CRC16_CheckBlock(U16 *Ptr,U16 Blen)
{
U16 i,k;
U16 CRCData = 0x0000;
U16 CheckData;
for(i=0,k=0;i<Blen;i++){
if(!(i%2)){
CheckData = Ptr[k]>>8;
CRCData = CRC16_CheckByte(CheckData,CRCData);
}
else{
CheckData = Ptr[k]&0xff;
CRCData = CRC16_CheckByte(CheckData,CRCData);
k++;
}
}
return CRCData;
}
/************************************************************************************************
*
* 名称: U16 CRC16_CheckByte(U16 Data,U16 CRCWord)
* 功能说明:CRC16 字节校验
* 调用: 无
* 输入:
* 返回值:
* 备注:
************************************************************************************************/
U16 CRC16_CheckByte(U16 Data,U16 CRCWord)
{
U16 i;
Data = (Data&0xff) << 8;
CRCWord = CRCWord ^ Data;
for(i=0;i<8;i++){
if(CRCWord & 0x8000){
CRCWord <<= 1;
CRCWord ^= CHECK_QUANTIC;
}
else{
CRCWord <<= 1;
}
}
return CRCWord;
}
//CRC的原理这里就不说了,16位的CRC在工程上有2个标准,1个是欧洲的IEEE,另一个是美国的CRC-16。我的实际应用中是选用CRC-16。CRC的算法有多种,有移位运算法,有查表法,还有一个是半字节查表的。我则只用移位法,不出错啊,不过速度慢了点。这里给出多年使用看的移位法的CRC-16的C的代码。
U16 CRC_16(U16 *buf,U16 len)
{
const unsigned int crc_gen = 0xa001; /*1,1000,0000,0000,0101B*/
unsigned int crc;
unsigned char i,j;
crc = 0xffff;
if (len != 0)
{
for(i = 0;i < len;i++)
{
crc ^= (unsigned int)(buf[i]);
for(j = 0;j < 8;j++)
{
if (crc & 0x01)
{
crc >>= 1;
crc ^= crc_gen;
}
else
crc >>= 1;
}
}
}
return crc;
} // end crc_16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -