我在使用Android上的蓝牙RFCOMM插槽时遇到了数据完整性问题。我连接没有任何问题,但我收到的数据是乱码,与发送的数据不同。数据由RS232设备通过手机连接的蓝牙适配器发送。适配器没有问题,因为如果我连接笔记本电脑,数据会被正确接收。
我的蓝牙连接是根据Android开发者网站(BluetoothChat)上的http://developer.android.com/resources/samples/BluetoothChat/index.html示例应用程序处理的,没有任何更改。发送的数据是纯文本和控制字符(在显示给用户之前被删除)。我遇到的具体问题是缺少一些文本,有些文本被重复,等等。 有趣的是,如果我连接到具有终端应用程序的计算机并在那里键入,数据传输正常。此外,如果我使用GetBlue应用程序连接到设备,则可以很好地接收数据。
所以我猜问题是GetBlue在处理蓝牙数据传输方面可能有什么不同,或者是否有其他方式通过Android上的RFCOMM插槽接收蓝牙数据?
答案 0 :(得分:10)
解决方案的修复方法是在连接线程中创建字符串,直接在InputStream上调用read()之后,然后将字符串传递回主线程进行显示。无论出于何种原因,在线程之间传递字节数组会导致重复的重复和数据丢失。
修改后的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);
}
答案 1 :(得分:2)
此错误是因为对象引用传递给UI,如果将字节数组(缓冲区)复制到另一个字节数组,则可以正常工作。