Вопрос

Управление потоком для многострочных ответов на пользовательские сообщения 15765-4 CAN через ELM327

Я использую адаптер ELM327 для подключения к порту OBD2 на своём автомобиле по протоколу ISO 15765-4 11b/500k. Я хочу запрашивать нестандартные сообщения, выходящие за рамки стандартных идентификаторов OBD2 (которые я отдельно регистрирую с помощью диагностического инструмента). Я пытаюсь вручную (а затем и программно) воспроизвести успешный поток запросов и ответов, который я вижу в диагностическом инструменте.


У меня всё работает, кроме многострочных ответов, для которых требуется сообщение управления потоком данных CAN. Сообщение управления потоком данных не работает, что препятствует получению дополнительных строк полезной нагрузки.


Хорошим примером может служить температура на впуске. Вот успешная трассировка диагностического инструмента:


5F0 02 21 01                -> initial request to 5F0 of length 02 with payload 21 01
6F0 10 1A 61 01 60 6B 5F 60 -> response from 6F0 explaining that there are 1A bytes to come
5F0 30 00 01 -> flow control message back to 5F0 saying send the lines
6F0 21 EF 81 05 69 67 05 F7 -> three additional lines of content.
6F0 22 65 1A 28 41 05 E8 65
6F0 23 05 FF 65 3B 00 00 AA

Чтобы воспроизвести это самостоятельно, без диагностического инструмента, я:


ATZ         -> Reset
ATSP6 -> Select Protocol: ISO 15765-4 11b/500k
ATSH5F0 -> Set Headers 5F0 (target can ID address)
ATCRA6F0 -> Set CAN Receive Address: 6F0

Примечание: у меня есть 2 последовательных терминала, подключённых к 2 адаптерам, объединённым в Y-образный разветвитель, подключённый к порту ODB, поэтому я могу запустить ещё один ELM327 в режиме AT MA, чтобы увидеть, что на самом деле происходит с автомобилем. Один из них предназначен только для чтения с помощью AT MA, а через другой я отправляю команды. Так я получил трассировку от диагностического инструмента, поэтому я не думаю, что проблема в этом.


Затем я могу отправить 21 01, который отображается как (а затем останавливается!):


5F0 02 21 01                -> great
6F0 10 1A 61 01 60 6B 5F 60 -> great, first line back from 6F0 is perfect
6F0 30 00 00 -> problem: seeing this instead of 5F0 30 00 01

Почему мой ELM автоматически отправляет сообщение об управлении потоком, отличное от того, которое отправляет мой диагностический прибор?


Хорошо, тогда давайте попробуем отключить автоматическое форматирование и автоматический контроль потока. Возможно, мы сможем сделать это вручную.


ATCAF0      -> Set CAN Automatic Formatting off (messages need to start with byte count now)
ATCFC0 -> Set CAN Flow Control off (need to manually send the flow control message when required)

После этого я могу отправить 02 21 01 (теперь мне нужно вручную указать количество байтов) и получить:


5F0 02 21 01                -> ok, as before
6F0 10 1A 61 01 60 D1 31 60 -> ok, as before

теперь я вручную отправляю команду управления потоком с кодом 30 00 01:


5F0 30 00 01                - ok, looks good (same as tool) but doesnt yield any more lines

Что я делаю не так и как это исправить?



Перевод вопроса с Mechanics Stack Exchange
Лицензия: CC BY-SA (2.5–4.0)
Оригинальный вопрос: https://mechanics.stackexchange.com/questions/91169/flow-control-for-multiline-responses-for-custom-15765-4-can-messages-over-elm327

0 Комментариев

  1. Соблюдаете ли вы временные ограничения? Согласно стандарту ISOTP, ответы на запросы управления потоком должны быть отправлены в течение 1000 мс, иначе кадр будет отброшен.


    Тем не менее, вы уверены, что в вашем адаптере OBD2 используется оригинальный ELM327, а не один из гигантских дешёвых клонов? Многие клоны имеют некачественную реализацию определённых аспектов протокола. Если вы делаете что-то помимо OBD2 (с чем они справляются нормально, ведь для этого они и предназначены), я настоятельно рекомендую использовать либо прямой адаптер CAN, либо что-то на базе STN22xx, например устройства семейства OBDLINK.


  1. Микки, да, это была команда ATFCSH, для которой также требуются FCSD и FCSM, но теперь у меня всё работает без ручной отправки управления потоком. Большое тебе спасибо. Теперь, когда я перечитал техническое описание Elm, всё стало очевидно. Я должен угостить тебя пивом (или несколькими) за LTAutomotive. Ваше здоровье!
  1. Что ж, по какой-то причине ваш ELM327 не распознаёт нестандартную (с точки зрения OBD2) пару адресов. Возможно, вам повезёт, если вы попытаетесь ввести ATFCSH5E0, что приведёт к тому, что адрес управления потоком станет 5E0.
  1. Хорошо, я проведу повторное тестирование, чтобы убедиться, что я вручную отвечаю в течение 1000 мс при отключении автоматического форматирования и автоматического управления потоком. Есть идеи, почему в первом сценарии с включённым автоматическим форматированием и автоматическим управлением потоком ELM отправляет управление потоком с заголовком, отличным от того, который отправляет диагностический инструмент? Можно ли использовать какие-то настройки заголовка для управления этим процессом, чтобы мне не приходилось делать это самостоятельно? Да, у меня есть несколько Bluetooth-адаптеров ODB разных производителей и один USB-адаптер. Я протестирую этот сценарий со всеми ними и посмотрю, есть ли разница в поведении.
Вы уже ответили на этот вопрос