计算CRC16(Modbus)值的函数

12
使用C#.net编写WPF应用程序,我要连接到一个设备(MODBUS协议),我必须计算CRC(CRC16)。我使用的函数计算普通的crc16,值是正确的,但我想要CRC16(modbus)的值。请帮我解决这个问题。

你是指从ModBus RTU帧中获取数值?你想要提取它吗? - Levente Kurusa
4个回答

8

3

你可以使用这个库:

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

1

只需使用:

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提供)


0
Boost CRC(由于标题而添加)
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());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接