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

Привет, я пытался вычислить 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) На правильном ли я пути или по пути заблудился?

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


person Azz    schedule 09.05.2013    source источник
comment
Я бы так не подумал. Протокол должен определять одни и те же параметры CRC, которые будут использоваться обоими сторонами.   -  person user207421    schedule 09.05.2013


Ответы (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"
person Mark Adler    schedule 09.05.2013
comment
DOH, это первый байт, большое спасибо, я прочитаю про X-25, думаю, отсюда со мной все будет в порядке - person Azz; 09.05.2013
comment
хорошо, вы хоть представляете, какое отношение имеет счет к следующему измененному байту? поскольку в нем счетчики E4, E6, E8, EA, EC, EE затем изменяются на 22, когда контроллер отправляет команду. - person Azz; 09.05.2013
comment
Нет. Если бы мне пришлось угадывать, я бы сказал, что это временная трансляция, где этот байт вместе с тремя байтами до или тремя байтами после - это количество секунд после некоторой эпохи. - person Mark Adler; 09.05.2013