lport3, вот смотри. Упирается всё в том, что мы пока точно не знаем, какой серийник должен быть в ответе. Не знаем какой длины и возможно вообще сменили в 3000 его месторасположение.
А если мы запишем серийник и снимем дамп памяти батареи, то будем знать каждый байтик.
Теперь, мы терминалом снимем такой-же опрос батареи, но уже на 3000 модели. И точно так-же, как я выше разложил всё по полочкам, разложим разговор терминала.
Мы точно вычислим, какую область памяти батареи отсылается в ответе в качестве серийника. И найдём в дампе эти байты. То есть, мы уже теоретически точно можем подтвердить местонахождение и длину серийника.
А по коду запросов-ответов можем составить картину сервисных ответов или обычных, сравнив с уже имеющимися.
Я уже прикинул, что коды идут однобайтовые (3-ий байт). И их не так уж много. В ответ возвращается код
06, а за ним данные, не считая последнего байта.
Рассмотрим первую строку:
5A 02 01 A2
Тут всё ясно...
- 5A - хедер запроса
- 02 - длина строки в байтах
- 01 - однобайтный код запроса (они пронумерованы по спецификации)
- A2 - последний байт корректирующей контрольной суммы
Заметь, в ответ всегда батарея вставляет код
06
Серийник батареи запрашивается кодом
0С
Кодом
80 запрашивается может заряд батареи и в ответ получает 16-байтный код. Скорее всего код двубайтный
80 08.
После второго опроса серийника уже запрашивается другой код
80 02, т.е. вероятно после второй проверки, убедившись в правильности, срабатывает следующая инструкция.
Кодом
81 08 возможно запрашивается цикл заряда и возвращается 8-байтный код.
Затем переходит на другую схожую инструкцию
81 0A
И остались коды
02,
03,
04,
07,
09 и
0B. Вот и вся арифметика =)