Привет, Я пытаюсь вычислить CRC для устройства, для которого я хочу написать программный интерфейс. Для простоты я скажу, что X - это устройство, а Y - аппаратный контроллер. Я ищу подталкивание в правильном направлении. Я уверен, что я на правильном пути, немного запутавшись в нескольких точках.CRC16 и передача данных
Когда устройство находится в режиме ожидания, он отправляет следующие строки данных каждые 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)
Когда я перехватывать команду от контроллера я получаю:
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) Общеизвестно, что d evice использовать один и тот же полином, но другой init и проверить на контроллер?
2) Является ли постоянная строка счетчика от устройства, используемого для смещения байта переменной, используемого для вычисления контрольной суммы? Если да, то что называется этим механизмом и какие методы могут быть использованы для определения отношения между счетчиком и байтом?
3) Я нахожусь на правильном пути или я потерялся на этом пути?
Спасибо, что нашли время, чтобы прочитать это и действительно оцените удар в правильном направлении.
я бы не думал. Протокол должен определять те же параметры CRC, которые будут использоваться обоими концами. – EJP