Ошибка передачи данных с помощью 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?

Solutions Collecting From Web of "Ошибка передачи данных с помощью SPP через Bluetooth на Android"

Исправление для решения заключалось в том, чтобы создать строку в подключенном потоке непосредственно после вызова 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); } 

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