Ошибка передачи данных при использовании SPP через Bluetooth на Android - PullRequest
11 голосов
/ 18 августа 2010

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

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

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

Ответы [ 2 ]

10 голосов
/ 19 августа 2010

Решением для решения было создание строки в подключенном потоке непосредственно после вызова 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 голосов
/ 01 апреля 2013

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

...