工业控制中的一些周边设备,其通信协议一般很多用modus 通信,而modus 通信就必须有 crc 效验,常用的效验是 CRC 16 ,显示CRC16 RTU 的实现方式。
直接上代码:
public static ushort CalculateCRC(byte[] buffer)
{
ushort CRC = 0xFFFF;
for (int CRC_count = 0; CRC_count < buffer.Length; CRC_count++)
{
byte data = buffer[CRC_count];
CRC ^= data; // 将 CRC 与当前字节进行异或操作
for (int i = 0; i < 8; i++)
{
if ((CRC & 1) != 0) // 检查 CRC 的最低位
{
CRC >>= 1; // 右移一位
CRC ^= 0xA001; // 如果最低位是 1,则与多项式 0xA001 进行异或
}
else
{
CRC >>= 1; // 否则仅右移一位
}
}
}
return CRC;
}
static void Main(string[] args)
{
// byte[] data = { 0x01, 0x03, 0x20, 0x00, 0x00, 0x01 }; // 替换为实际数据
byte[] data = { 0x01, 0x10, 0x21, 0x03, 0x00, 0x01,0x02,0x01,0xf4}; // 替换为实际数据
ushort crc = CalculateCRC(data);
byte c = (byte)(0x00FF & crc); // 低位
byte c2 = (byte)( (0xFF00 & crc) >>8); // 高位
string s = crc.ToString("X4"); //
Console.WriteLine("CRC16-RTU: " + crc.ToString("X4")); // 以十六进制格式输出 CRC 值. 一般CRC 是高位在后,低位在前
}