Привет, я пытался вычислить CRC для устройства, для которого хочу написать программный интерфейс. Для простоты я скажу, что X - это устройство, а Y - аппаратный контроллер. Я ищу толчок в правильном направлении. Я уверен, что нахожусь на правильном пути, но немного запутался в некоторых моментах.
Когда устройство находится в режиме ожидания, оно отправляет следующие строки данных каждые 2 секунды или около того, что похоже на шестнадцатеричный счет: 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=(none)
Когда я перехватываю команду a от контроллера, я получаю:
X: 96 10 01 E1 (EE) 01 FF 10 17 | 5F A0 | FE 10 06 E1 96 FE -- Last line before command 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 получается от E4? это еще один 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=(none)
Полином тот же, но инициализация и проверка различаются, извините за длинный пост, но вот краткое изложение моих вопросов:
1) Часто ли, скажем, устройство использует один и тот же полином, но отличается от инициализации и проверки контроллера?
2) Используется ли постоянный счетчик строк от устройства для смещения байта переменной, используемого для вычисления контрольной суммы? Если да, то как называется этот механизм и какие методы можно использовать для получения взаимосвязи между счетчиком и байтом?
3) На правильном ли я пути или по пути заблудился?
Спасибо, что нашли время, чтобы прочитать это, и буду очень признателен за толчок в правильном направлении.