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