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

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

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

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

11
задан Sam Rad 16 June 2014 в 09:55
поделиться

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);
            }
10
ответ дан 3 December 2019 в 09:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: