Управление потоком для многострочных ответов на пользовательские сообщения 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
Соблюдаете ли вы временные ограничения? Согласно стандарту ISOTP, ответы на запросы управления потоком должны быть отправлены в течение 1000 мс, иначе кадр будет отброшен.
Тем не менее, вы уверены, что в вашем адаптере OBD2 используется оригинальный ELM327, а не один из гигантских дешёвых клонов? Многие клоны имеют некачественную реализацию определённых аспектов протокола. Если вы делаете что-то помимо OBD2 (с чем они справляются нормально, ведь для этого они и предназначены), я настоятельно рекомендую использовать либо прямой адаптер CAN, либо что-то на базе STN22xx, например устройства семейства OBDLINK.