#define LOW_FRONT 0x00
//CRC16-IBM 校验,初始值0x0000,多项式8005
//计算结果输出高位在左低位在右,使用时注意顺序
u16 IBM_CRC16(u8 *buf,u8 length)//CRC16计算
{
u8 i;
u16 crc=0x0000;//CRC寄存器初始值0x0000
while(length--)
for(crc^=*(buf++),i=0;i<8;i++)
crc=(crc&0x0001)?(crc>>1)^0xA001:crc>>1;
return crc;
}
//对数据进行CRC校验,然后按输入参数将校验码补充到原数组尾部
//* data 要校验的数组指针, len要校验的数据长度
//pad_type: 校验码补充方式,1,高位在前;0,低位在前
void data_CRC16_make(u8* data, u8 len, u8 pad_type)
{
u16 crc_tmp = IBM_CRC16(data,len);//对接收到的数据进行CRC校验
u8 tmp_L = (crc_tmp>>0)&0xff;
u8 tmp_H = (crc_tmp>>8)&0xff;
printf("crc res: %04x\r\n",crc_tmp);
if(pad_type == LOW_FRONT)
{
data[len] = tmp_L;
data[len+1] = tmp_H;
}
else
{
data[len] = tmp_H;
data[len] = tmp_L;
}
}
注意,指针指向的数组空间必须足够,否则会内存越界。