使用C#.net编写WPF应用程序,我要连接到一个设备(MODBUS协议),我必须计算CRC(CRC16)。我使用的函数计算普通的crc16,值是正确的,但我想要CRC16(modbus)的值。请帮我解决这个问题。
有很多关于Modbus协议crc16计算的在线资源。
例如:
http://www.ccontrolsys.com/w/How_to_Compute_the_Modbus_RTU_Message_CRC
我认为将那段C#代码翻译应该很简单。你可以使用这个库:
https://github.com/meetanthony/crccsharp
它包含多个CRC算法,包括ModBus。public byte[] CalculateCrc16Modbus(byte[] bytes)
{
CrcStdParams.StandartParameters.TryGetValue(CrcAlgorithms.Crc16Modbus, out Parameters crc_p);
Crc crc = new Crc(crc_p);
crc.Initialize();
var crc_bytes = crc.ComputeHash(bytes);
return crc_bytes;
}
只需使用:
public static ushort Modbus(byte[] buf)
{
ushort crc = 0xFFFF;
int len = buf.Length;
for (int pos = 0; pos < len; pos++)
{
crc ^= buf[pos];
for (int i = 8; i != 0; i--)
{
if ((crc & 0x0001) != 0)
{
crc >>= 1;
crc ^= 0xA001;
}
else
crc >>= 1;
}
}
// lo-hi
//return crc;
// ..or
// hi-lo reordered
return (ushort)((crc >> 8) | (crc << 8));
}
(感谢https://www.cyberforum.ru/csharp-beginners/thread2329096.html提供)
auto v = std::vector< std::uint8_t > { 0x12, 0x34, 0x56, 0x78 };
auto result = boost::crc_optimal<16, 0x8005, 0xFFFF, 0, true, true> {};
result.process_bytes(v.data(), v.size());