原理不再赘述,网上很多。
/* CRC16 余式表 */
static uint16_t crctalbeabs[] = {
0x0000, 0xCC01, 0xD801, 0x1400, 0xF001, 0x3C00, 0x2800, 0xE401,
0xA001, 0x6C00, 0x7800, 0xB401, 0x5000, 0x9C01, 0x8801, 0x4400
};
/*!
* 功 能: CRC16校验
* param1: 指向要校验的数据的指针
* param2: 要校验的数据的长度
* retval: 校验所得到的值,uint16_t 类型
*
* 说 明: 本次CRC校验为查表法,多项式为 x16+x15+x2+1(0x8005),CRC的初始值为0xFFFF
*/
uint16_t Crc16(uint8_t *ptr, uint32_t len)
{
uint16_t crc = 0xffff;
uint32_t i;
uint8_t ch;
uint16_t ccc = 0x0;
for (i = 0; i < len; i++) {
ch = *ptr++;
crc = crctalbeabs[(ch ^ crc) & 15] ^ (crc >> 4);
crc = crctalbeabs[((ch >> 4) ^ crc) & 15] ^ (crc >> 4);
}
ccc=(crc<<8)|ccc; //有的不需要反转高低位可以删去这两行
ccc=(crc>>8)|ccc; //有的不需要反转高低位可以删去这两行
return ccc; //直接return crc
}