ELM327 возвращает `?` При попытке использовать его с ODB Java API

Я пытаюсь использовать ODB Java API (эту библиотеку), чтобы получить данные из ELM327 через Bluetooth из моего автомобиля, но в ответ ? на каждый запрос и библиотека поднимает MisunderstoodException

Вот мой код:

socket = device.createInsecureRfcommSocketToServiceRecord(uuid);
socket.connect();

    final CustomRPMCommand engineRpmCommand = new CustomRPMCommand();
    final SpeedObdCommand speedObdCommand = new SpeedObdCommand();
    while (!Thread.currentThread().isInterrupted()) {
        engineRpmCommand.run(socket.getInputStream(), socket.getOutputStream());
        speedObdCommand.run(socket.getInputStream(), socket.getOutputStream());

        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                speedometerGauge.setSpeed(engineRpmCommand.getRPM(), true);
                rpmGauge.setSpeed(speedObdCommand.getMetricSpeed(), true);
            }
        });
    }

В чем дело?

1 ответ

Я также использовал ту же библиотеку для первых шагов, чтобы попробовать OBD, так что я могу сказать, по крайней мере, когда я ее использовал, она работала нормально.

Однако из моего опыта, получая ? иногда это может случиться с дешевыми устройствами Bluetooth (возможно, даже с дорогими? никогда не было). Я предполагаю, что это произойдет, если некоторые биты будут потеряны во время передачи, потому что тогда команда будет неправильно понята.

То, что я сделал, чтобы обойти эту проблему, это настроить процесс, в который я отправил все AT команды до 10 раз, пока я не получу желаемый ответ OK (кроме ATZ, который ответит ELM327). Что касается запросов значений, таких как RPM и т. Д., Я обычно просто выбрасываю ошибочные значения.

Это короткий ответ, но так как такие проблемы с устройствами могут сильно раздражать, я помогу вам отладить весь процесс...

Настройка терминала на Windows

Прежде всего, чтобы проверить работоспособность устройства ELM, вы можете напрямую отправлять команды на последовательный интерфейс. В Windows это возможно с использованием, например, TeraTerm, а затем настройкой нового подключения Bluetooth на ваших окнах в качестве COM-устройства (найдите Bluetooth в start -> search box а затем выберите Change Bluetooth settings или похожие). Оттуда, перейдите к COM connections а затем добавить новый Outgoing для устройства Bluetooth OBDII. Немного подождите, пока Windows вычислит новый номер COM-порта, он вам понадобится.

Если вы не можете найти OBDII в раскрывающемся списке вы должны сначала связать свой ПК с устройством Bluetooth. Это можно сделать через devices and printers, там вы должны увидеть устройство OBDII, так что вам нужно только подключить его (PIN-код обычно 1234).

Если вы работаете в Linux, это может быть проще, но я этого не делал:)

Отправка некоторых команд через терминал

Установив соединение Bluetooth и TeraTerm, вы можете запустить TeraTerm и подключиться к адаптеру. выберите Serial а затем порт, который вы только что настроили. Убедитесь, что никакое другое устройство не подключено к адаптеру OBD (также не к вашему телефону). Только одно устройство может быть подключено одновременно.

Если соединение прошло успешно, вы сможете набирать буквы. Обычно в настройках по умолчанию вы должны видеть буквы, которые вы вводите (режим Echo включен), но поскольку это не точно, просто введите ATZ и ударил <Enter>, ELM теперь должен ответить "ELM327" в той же строке (что для меня обычно приводит к нечетному отображению, если echo mode был включен, но вы должны получить любой ответ).

С терминала я обычно отправляю эти команды по порядку:

ATZ
E1
L1
010c

Это вызовет:

  1. Сброс устройства OBD
  2. Убедитесь, что эхо включено, чтобы я видел, что я печатаю
  3. Убедитесь, что перевод строки включен, чтобы мы получили ответы на следующей строке
  4. Запросить обороты с автомобиля

Между каждой командой я проверю, каков ответ устройства. Для всех AT Команды (1., 2. и 3.) должны быть OK, Если я вернусь ?, что может случиться, я повторю команду в другой раз. Вы увидите, что в таком случае устройство действительно не следовало инструкциям, например, не включало перевод строки, если оно было выключено. Поэтому нам действительно нужно отправить его снова.

С другой стороны, в режиме программирования мы установим e0 а также l0 (режим эха выключен и перевод строки отключен), потому что мы не хотим получать обратно то, что уже отправили.

Другие вопросы по тегам