CRC-CCITT 16-битное вычисление в C # - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь написать одну программу для связи через последовательный порт, где мне нужно отправить пакет данных с помощью CRC, я пишу этот код на языке C #.

Ниже приведен пример пакета, который получатель ожидает с CRC.

10 02 B1 F0 3F 32 08 00 00 10 03 B4 5C

Второй пакет данных: 10 02 B1 F0 3F 32 07 00 00 10 03 4D EE

10 - код DLE

02 - STX

B1 F0 3F 32 08 00 00 - данные

10 - DLE

03 -ETX

B4 - Нижний байт CRC

5C - Верхний байт CRC

CCIT : (Fx) = x16 + x12 + x5 + 1

Начальное рабочее значение: FFFFH

Я пробовал некоторые онлайн-калькуляторы CRC, но пока что не повезло, кто-нибудь может подсказать, как рассчитать CRC для вышеуказанных данных (B1 F0 3F 32 08 00 00)?Может быть, может предложить онлайн калькулятор, который может дать мне выше вывод (B4 5C).

Спасибо за ваш совет!

1 Ответ

1 голос
/ 20 июня 2019

Я нашел кое-что, что работает, но это кажется немного странным.

Сначала я xor'ed два образца

10 02 B1 F0 3F 32 08 00 00 10 03 B4 5C
10 02 B1 F0 3F 32 07 00 00 10 03 4D EE
--------------------------------------
00 00 00 00 00 00 0F 00 00 00 00 F9 B2

Это исключает начальные значения CRC и конечные значения xor и привело к использованию CRC с отражением бита 0x11021. Похоже, что CRC использует 8 байтов данных, включая завершающий 0x10.

Используя калькулятор CRC, связанный с нижеследующим, выберите любой CRC16, затем щелкните по пользовательскому и установите параметры: входной сигнал отражен, выходной сигнал проверен, poly = 0x1021. Недостаточно информации для определения начального и конечного значения xor без сообщения другого размера. Используя 8 байтов данных, некоторые примеры параметров: начальное значение = 0x5B08, конечное значение xor = 0x0000 или начальное значение = 0xffff, конечное значение xor = 0xdde5 или начальное значение = 0x0000, конечное значение xor = 0xa169.

При использовании отраженных параметров бит калькулятора инвертирует значение инициализации (0x5B08 - бит 0x17DA в обратном порядке). Для кода используются 3 комбинации: {0x17da, 0x0000}, (0xffff, 0xdde5}, {0x0000,0xa169}. Poly = 0x8408 и смещение вправо.

Используя хх для обозначения введенных данных, я получил

xx xx B1 F0 3F 32 08 00 00 10 xx B4 5C
xx xx B1 F0 3F 32 07 00 00 10 xx 4D EE

Поскольку первые два байта являются {10 02}, это фиксированные значения, их можно включить, изменив начальное значение. Однако я не смог включить значение ETX 03.

http://www.sunshine2k.de/coding/javascript/crc/crc_js.html

...