Полгода не мог понять причину. Все усложнялось тем, что проверять надо было в чужих машинах, а на эмуляторе все работало.
Сперва о проблеме. В пакете CAN можно передать максимум 8 байтов данных. Для атомарной передачи больших данных обычно используется стандарт ISO15765-2. Он определяет разбитие больших данных на мелкие пакеты. И вот некоторые блоки в ответ на запросы моей программы присылали только первый пакет. Это касалось подключения через K+CAN, тогда как с PassThru и ELM327 все было нормально.
Сперва думал, что проблема с таймаутами. Всяко разно крутил, но ничего не помогало. И вот решил очень внимательно вычитать программный код. И нашел подозрительное место: везде отправляемые CAN-пакеты добивалась до 8-байт данных, но пакет "Flow Control" отправлялся "неполным".
Посмотрел трассировку, так и есть. Например, при подключении через K+CAN отправлялись три байта данных в CAN-пакете:
30 00 08
А при подключении через PassThru и ELM327 отправлялись восемь байтов (хотя смысл имеют только первые три, остальные - это незначащие нули):
30 00 08 00 00 00 00 00
Получается, что некоторые блоки (например, многие блоки АКПП) не понимают такой неполный "Flow Control" пакет, поэтому не продолжали отправку пакетов ответа, ограничившись только первым.
Легко исправил, проверил - все отлично. K-CAN теперь работает со всеми сузуковскими CAN-блоками, на которых удалось потестировать. В следующей версии будет это изменение.
0 comments:
Post a Comment