CRC16 и передача данных

Привет, я пытался вычислить CRC для устройства, для которого я хочу написать программный интерфейс. Для простоты я скажу, что X - это устройство, а Y - это аппаратный контроллер. Я ищу толчок в правильном направлении, я уверен, что я на правильном пути, немного запутавшись в нескольких моментах.

Когда устройство находится в режиме ожидания, каждые две секунды он отправляет следующие строки данных, которые выглядят так, как если бы они считали в шестнадцатеричном виде: 2 байта между | | это CRC я предполагаю. (XX) - это переменный байт.

X: 96 10 01 E1 (E4) 01 FF 10 17 | F7 EC | 10 06 E1 96 FE 
X: 96 10 01 E1 (E6) 01 FF 10 17 | 7F FA | 10 06 E1 96 FE 
X: 96 10 01 E1 (E8) 01 FF 10 17 | C7 9B | 10 06 E1 96 FE 
X: 96 10 01 E1 (EA) 01 FF 10 17 | 4F 8D | FE 10 06 E1 96 FE 
X: 96 10 01 E1 (EC) 01 FF 10 17 | D7 B6 | FE 10 06 E1 96 FE 
X: 96 10 01 E1 (EE) 01 FF 10 17 | 5F A0 | FE 10 06 E1 96 FE 

С помощью reveng с reveng -w 16 -s и вышеупомянутые наборы данных, которые я получаю:

width = 16 poly = 0x1021 init = 0x1e69 refin = true refout = true xorout = 0x0000 check = 0x3da6 name = (нет)

Когда я перехватываю команду от контроллера, я получаю:

X: 96 10 01 E1 (EE) 01 FF 10 17 | 5F A0 | FE 10 06 E1 96 FE - Последняя строка перед командой
Y: E1 10 01 96 (22) 05 01 C0 A8 35 00 10 17 |0B B8| FE 10 06 96 E1 FE

Где (22) - модификатор |0B B8| это CRC. Как получается 22 из Е4? это еще один CRC?

Когда я отправил одну и ту же команду несколько раз, я перехватил следующее:

Y: E1100196220501C0A8350010170BB8FE100696E1FE 
Y: E11001962A0501C0A835001017C1C7FE100696E1FE 
Y: E11001962E0501C0909400101753C8FE100696E1FE  
Y: E1100196300501809094001017C3EEFE100696E1FE  
Y: E1100196360501C090940010170D48FE100696E1FE  
Y: E11001962A0501C09094001017B6F7FE100696E1FE 
Y: E11001962A0501C09094001017B6F7FE100696E1FE

С помощью reveng с reveng -w 16 -s и вышеупомянутые наборы данных, которые я получаю:

width = 16 poly = 0x1021 init = 0xd313 refin = true refout = true xorout = 0x0000 check = 0x295f name = (нет)

Полином одинаков, но init и check различаются, извините за длинный пост, но вот краткое изложение моих вопросов:

1) Обычно ли, например, устройство использует один и тот же многочлен, но разные init и проверку для контроллера?

2) Являются ли строки с постоянным счетом устройства, используемого для смещения байта переменной, используемого для вычисления контрольной суммы? Если да, то как называется этот механизм и какие методы можно использовать для определения взаимосвязи между количеством и байтом?

3) Я на правильном пути или я заблудился?

Спасибо, что нашли время, чтобы прочитать это и был бы признателен за удар в правильном направлении.

1 ответ

Решение

Удалите первый байт из ваших последовательностей X и Y, и тогда вы получите оба:

width=16  poly=0x1021  init=0xffff  refin=true  refout=true  xorout=0xffff  check=0x906e  name="X-25"

Для остроумия:

% reveng -w 16 -s 100196220501C0A8350010170BB8 1001962A0501C0A835001017C1C7 1001962E0501C0909400101753C8 100196300501809094001017C3EE 100196360501C090940010170D48 1001962A0501C09094001017B6F7 
width=16  poly=0x1021  init=0xffff  refin=true  refout=true  xorout=0xffff  check=0x906e  name="X-25"

% reveng -w 16 -s 1001E1E401FF1017F7EC 1001E1E601FF10177FFA 1001E1E801FF1017C79B 1001E1EA01FF10174F8D 1001E1EC01FF1017D7B6 1001E1EE01FF10175FA0
width=16  poly=0x1021  init=0xffff  refin=true  refout=true  xorout=0xffff  check=0x906e  name="X-25"
Другие вопросы по тегам