【发布时间】:2012-08-30 22:56:43
【问题描述】:
我正在开发一个 Android 应用程序,它使用蓝牙连接在我的 Android 智能手机和非 Android 蓝牙模块之间传输数据,使用 SPP 配置文件。我使用了来自 Android 开发者网站的蓝牙聊天示例作为参考。
我已经成功地让两个设备相互连接,并将简单的字符串从智能手机发送到蓝牙模块。但是我在读取从模块发回的数据时遇到了一些错误。我使用以下代码,与蓝牙聊天示例中完全相同,从 InputStream 读取数据
while (true) {
try {
// Read from the InputStream
bytes = mmInStream.read(buffer);
String str = new String(buffer);
Log.i(TAG, "mmInStream - " + str);
// Send the obtained bytes to the UI Activity
mHandler.obtainMessage(BluetoothChat.MESSAGE_READ, bytes, -1, buffer)
.sendToTarget();
} catch (IOException e) {
Log.e(TAG, "disconnected", e);
connectionLost();
break;
}
}
当我的蓝牙模块向手机发送一个简单的字符串时,该字符串没有被正确接收。它以随机方式分成几部分。例如,如果我向手机发送 3 次“1234567890abcdef1234567890abcdef0123456789”,则 Eclipse 上的 Logcat 将记录这些:
mmInstream - 12345678910abcdef��������(continuing null)
mmInstream - 1��������(continuing null)
mmInstream - 2345678910abcdef0123456789��������(continuing null)
第一次。在第二次和第三次传输数据时,它是在不同的块中接收的:
mmInstream - 1234567891�������(continuing null)
mmInstream - 0abcdef012�������(continuing null)
mmInstream - 3456789���������(continuing null)
mmInstream - 1234567891����������������(continuing null)
mmInstream - 0abcdef0123456789������������(continuing null)
我不知道为什么会发生这种情况以及如何解决这个问题。如果以这样的任意方式接收数据,我将无法获得必要的数据进行处理。我怎样才能把它弄成一个整体?
任何帮助将不胜感激。
非常感谢。
【问题讨论】:
-
睡眠命令对我有用。使用上述作为额外的保证。谢谢!那么,您如何在主 UI 中检索此字符串? Handler mHandler = new Handler(){ @Override public void handleMessage(Message message){ /*字符串检索*/ } }
-
应该是
new String(buffer, 0, bytes)。没有什么可以保证您在一次阅读中就可以收到完整的消息。您只需要处理解析字节流而不是缓冲区的问题。这并不难。
标签: android bluetooth inputstream