Я пытаюсь связаться с Bluetooth-ключом ELM327 OBDII, используя пример Android BluetoothChat. Я могу без проблем подключиться к устройству, и сообщения BluetoothChat на устройство ODBII передаются и принимаются устройством правильно.
Однако ответные сообщения от устройства OBDII часто разбиты на несколько сообщений, зашифрованы или отсутствуют символы.
Например, требуется три попытки команды ati
, чтобы получить полный ожидаемый ответ:
Me: ati
OBDII: a
OBDII: 327
OBDII: 327
OBDII: 327 v1.5 >
Me: ati
OBDII: 1
OBDII: 1
OBDII: 1.5 >v
OBDII: 1.5 >
Me: ati
OBDII: ELM327 v1.5 >
Точно так же отправка 010c
должна вызвать однострочный ответ, содержащий три шестнадцатеричных пары. Вместо этого я обычно (но не всегда) получаю такие результаты:
Me: 010c
OBDII:
OBDII: 4
OBDII: 3C
OBDII: 3
OBDII: 3C C
OBDII: 3C
OBDII:
OBDII:
OBDII: >
Я пробовал несколько разных скоростей передачи данных и разные протоколы OBDII, но изменения настроек по умолчанию только усугубляют ситуацию. Есть ли проблема с обработкой моего ответного сообщения? Почему ответное сообщение разделяется? Bluetooth-адаптер корректно работает с доступными приложениями, такими как Torque, поэтому я не думаю, что устройство неисправно.
Код, который я использую, почти идентичен проекту BluetoothChat (источник здесь). Я только изменил UUID для своего устройства Bluetooth и добавил возврат каретки в исходящее сообщение (согласно этому StackOverflow вопрос).
Изменение 1 (в BluetoothChatService.java):
// Unique UUID for this application
private static final UUID MY_UUID_SECURE =
//UUID.fromString("fa87c0d0-afac-11de-8a39-0800200c9a66");
UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
private static final UUID MY_UUID_INSECURE =
//UUID.fromString("8ce255c0-200a-11e0-ac64-0800200c9a66");
UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
Изменение 2 (в BluetoothChat.java):
// The action listener for the EditText widget, to listen for the return key
private TextView.OnEditorActionListener mWriteListener =
new TextView.OnEditorActionListener() {
public boolean onEditorAction(TextView view, int actionId, KeyEvent event) {
// If the action is a key-up event on the return key, send the message
if (actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_UP) {
String message = view.getText().toString();
//sendMessage(message);
sendMessage(message + "\r");
}
if(D) Log.i(TAG, "END onEditorAction");
return true;
}
};