2013-05-09 2 views
1

Привет, Я пытаюсь вычислить 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) Я нахожусь на правильном пути или я потерялся на этом пути?

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

+0

я бы не думал. Протокол должен определять те же параметры CRC, которые будут использоваться обоими концами. – EJP

ответ

2

Оставьте первый байт с вашего 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" 
+0

DOH, это первый байт, спасибо вам большое, я прочитаю о X-25. Я думаю, что я должен быть в порядке отсюда – Azz

+0

ОК, вы хоть представляете, какие отношения подсчеты имеют для следующего разнообразного байта? так как в нем подсчитываются E4, E6, E8, EA, EC, EE, затем изменяется на 22, когда контлер отправляет команду. – Azz

+0

Нет. Если бы я должен был догадаться, я бы сказал, что это передача времени, где этот байт вместе с тремя байтами до или через три байта - это количество секунд после некоторой эпохи. –

Смежные вопросы