MODBUS RTU通信的 CRC16计算

#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);
}