#define POLY 0xa001;
/**
*根据ModBus规则计算CRC16
*addr:待计算数据的起始地址
*num:待计算数据长度(字节数)
*返回值:16位校验值
**/
uint16_t crc16(uint8_t *addr, uint32_t num)
{
uint16_t crc = 0xFFFF
for(;num > 0;num--)
{
crc = crc^(*addr++);
for(int i = 0;i<8;i++)
{
if(crc & 0x0001)
crc = (crc>>1)^POLY;
else
crc >>= 1;
}
}
return(crc);
}