最近在写c#的上位机的时候,发送的数据需要进行crc校验,找了很多人的应该不是modbus版本,校验出来都不太对,最后在某大佬博客发现能用的,稍加修改。
原博客地址:使用C#配合modbus协议的16进制代码生成crc16校验码的计算方法 - 山中修炼十余载 - 博客园 (cnblogs.com)
记下来留作备用。
public class ModbusCrc
{
public static uint CalcCRC16(byte[] pBuf)
{
uint i, j;
uint crc16 = 0xFFFF;
uint crc_temp;
for (i = 0; i < pBuf.Length; i++)
{
crc16 ^= pBuf[i];
for (j = 0; j < 8; j++)
{
if ((crc16 & 0x0001) != 0)
{
crc16 >>= 1; // 右移一位
crc16 ^= 0xA001; // 异或多项式0xA001
}
else
{
crc16 >>= 1; // 右移一位
}
}
}
crc_temp = (crc16 & 0x00ff)<<8;//改一下,让低位在前,删除这两行就是高位在前
crc16 = crc_temp+(crc16>>8);
return crc16;
}
}