Ошибка передачи данных Transmisison с использованием SPP через Bluetooth на Android

У меня возникла проблема с целостностью данных, используя сокет RFCOMM через Bluetooth в Android. У меня нет проблем с подключением, но полученные данные искажаются и не совпадают с данными, которые отправляются. Данные отправляются устройством RS232 через адаптер Bluetooth, к которому подключается телефон. Нет проблем с адаптером, поскольку данные будут правильно приняты, если я подключусь к ноутбуку.

Мое соединение Bluetooth обрабатывается на основе BluetoothChat образца приложения, найденного на сайте разработчика Android (http://developer.android.com/resources/samples/BluetoothChat/index.html) без изменений. Передаваемые данные представляют собой простые текстовые и управляющие символы (которые удаляются перед отображением пользователю). У меня есть конкретная проблема: некоторые тексты отсутствуют, некоторые из них повторяются и т.д. Самое смешное, если я подключаюсь к компьютеру с терминальным приложением и нахожу там, данные передаются в порядке. Кроме того, если я подключаюсь к устройству с помощью приложения GetBlue, данные получаются в порядке.

Итак, я думаю, проблема в том, что делает GetBlue, возможно, по-другому работать с передачей данных Bluetooth, или есть другой способ получить данные Bluetooth через разъем RFCOMM на Android?

Ответ 1

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

Измененный код run():

    public void run() {
        byte[] buffer = new byte[256];  // buffer store for the stream
        int bytes; // bytes returned from read()

        // Keep listening to the InputStream until an exception occurs
        while (true) {
            try {
                // Read from the InputStream
                bytes = mmInStream.read(buffer);
                String readMessage = new String(buffer, 0, bytes);
                // Send the obtained bytes to the UI Activity
                mHandler.obtainMessage(MESSAGE_READ, bytes, -1, readMessage)
                        .sendToTarget();
            } catch (IOException e) {
                break;
            }
        }
    }

И прием обработчика:

        case MESSAGE_READ:
            // Read in string from message, display to mainText for user
            String readMessage = (String) msg.obj;
            if (msg.arg1 > 0) {
                mainText.append(readMessage);
            }

Ответ 2

Эта ошибка связана с тем, что ссылка на объект передается в пользовательский интерфейс. Если вы копируете массив байтов (буфер) в другой массив байтов, он работает.