Как рассчитать CRC16 Modbus RTU C#

118
18 августа 2019, 16:00

Столкнулся с проблемой, взял пример для расчета CRC16 Modbus на C# отсюда Код скомпилировал, создал юнит-тест:

    [Test]
    public void Crc16AnciCalculateTest()
    {
        Assert.AreEqual(new byte[] { 0x37, 0x4B }, Crc16AnciUtility.ComputeChecksumBytes(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }));
    }

И он не проходит. Сверял с несколькими онлайн калькуляторами, например вот такой

Ввожу в калькуляторе 123456789 и выбираю input ASCI: результат для Modbus - 0x4B37. В моем случае:

byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 } 

возвращает - B20E

Я подумал, что неверный пример. Взял нугет Tako.CRC, набросал консольное приложение:

static void Main(string[] args)
    {
        byte[] bytes = {1, 2, 3, 4, 5, 6, 7, 8, 9};
        CRCManager crcManager = new CRCManager() {DataFormat = EnumOriginalDataFormat.HEX};
        var provider = crcManager.CreateCRCProvider(EnumCRCProvider.CRC16Modbus);
        var status = provider.GetCRC(bytes);
        Console.Write("Input: ");
        foreach (var b in bytes)
        {
            Console.Write(b + " ");
        }
        Console.WriteLine();
        Console.WriteLine($"Output: {status.CrcHexadecimal}");
        Console.ReadLine();
    }

В результате получил такое же значение...

Не пойму, почему с онлайн калькуляторами значение не совпадает? Может я не правильно ввожу данные? Но я пробовал даже по одному числу или строку вводить, все равно не сходятся результаты. Кому верить? Буду рад за разъяснения и помощь, заранее благодарен!

Answer 1

Ой ой ой, решил проблему, все сходится. Не верно делал ввод данных. Метод принимает массив байт, я в него передавал целые числа. Если передавать Hex, то все совпадает.

byte[] bytes = {0x23, 0x25};

READ ALSO
Как заставить ИИ слышать звуки и реагировать на них?

Как заставить ИИ слышать звуки и реагировать на них?

Как заставить бота слышать звуки (например, выстрелы разной громкости из-за разных видов оружия), и реагировать на них, если он их слышитТак...

116
Как найти индекс элемента в двумерном массиве

Как найти индекс элемента в двумерном массиве

День добрый, реализовываю замену элемента в массиве по индексу через DGVВыглядит следующим образом (получаю значение элемента по выделенной...

134
Путь к компилятору c#. JetBrains Rider

Путь к компилятору c#. JetBrains Rider

Не могу отыскать компилятор в JetBrains RiderПрошу указать путь к папке в которой он находится

121