Разделенное ответное сообщение BluetoothChat-to-ELM327

Я пытаюсь связаться с 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;
    }
};

справочное руководство по ELM327


person nth0007    schedule 19.08.2014    source источник


Ответы (1)


Я нашел решение проблемы разделения сообщений в этот проект BluetoothSPP пользователя akexorcist на Github. Соответствующая функция из класса ConnectedThread представлена ​​ниже:

     public void run() {
   byte[] buffer;
   ArrayList<Integer> arr_byte = new ArrayList<Integer>();

   // Keep listening to the InputStream while connected
   while (true) {
      try {
            int data = mmInStream.read();
            if(data == 0x0A) { 
            } else if(data == 0x0D) {
                buffer = new byte[arr_byte.size()];
                for(int i = 0 ; i < arr_byte.size() ; i++) {
                    buffer[i] = arr_byte.get(i).byteValue();
                }
               // Send the obtained bytes to the UI Activity
               mHandler.obtainMessage(BluetoothState.MESSAGE_READ
                        , buffer.length, -1, buffer).sendToTarget();
               arr_byte = new ArrayList<Integer>();
            } else {
               arr_byte.add(data);
            }
       } catch (IOException e) {
           connectionLost();
           // Start the service over to restart listening mode
           BluetoothService.this.start(BluetoothService.this.isAndroid);
           break;
       }
   }
}

По-видимому, хотя, пожалуйста, поправьте меня, если я ошибаюсь, .read() не может захватывать и поддерживать формат любых байтов, появляющихся в потоке, без какой-либо помощи.

person nth0007    schedule 27.08.2014
comment
Ссылка вверху битая - person Hayden Thring; 05.04.2015