C语言计算CRC-16示例
2023-09-27 11:09:18
//本实验在8位单片机环境中测试通过,其它平台可能需要稍加修改
//调用方法:calculate_crc(DATA,8);
//预先在DATA数组里存入数据,8代表有8个字节要计算
//Modbus通常只算前面6个字节,即:calculate_crc(DATA,6);
//CRC-16计算,下面为全部代码
//*z_p指向发送缓冲区的首字节,z_message_length是要计算的字节数。
void calculate_crc(unsigned char*z_p, unsigned char z_message_length)
{
unsigned int CRC=0xffff ;
unsigned int next;
unsigned int carry;
unsigned int ncrc;
while (z_message_length--)
{
next=(unsigned short)*z_p;
CRC^=next;
for (ncrc = 0; ncrc < 8; ncrc++)
{
carry = CRC&1;
CRC>>= 1;
if (carry)
{
CRC^=0xA001;
}
}
z_p++;
}
CRCH=CRC/256; //返回值高位
CRCL=CRC%256; //返回值低位
}
//代码示例结束