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
Это вызовет:
- Сброс устройства OBD
- Убедитесь, что эхо включено, чтобы я видел, что я печатаю
- Убедитесь, что перевод строки включен, чтобы мы получили ответы на следующей строке
- Запросить обороты с автомобиля
Между каждой командой я проверю, каков ответ устройства. Для всех AT
Команды (1., 2. и 3.) должны быть OK
, Если я вернусь ?
, что может случиться, я повторю команду в другой раз. Вы увидите, что в таком случае устройство действительно не следовало инструкциям, например, не включало перевод строки, если оно было выключено. Поэтому нам действительно нужно отправить его снова.
С другой стороны, в режиме программирования мы установим e0
а также l0
(режим эха выключен и перевод строки отключен), потому что мы не хотим получать обратно то, что уже отправили.