the*_*man 16 android bluetooth inputstream
我正在使用一个Android应用程序,它使用蓝牙连接在我的Android智能手机和非Android蓝牙模块之间传输数据,使用SPP配置文件.我使用Android Developer网站的蓝牙聊天示例作为参考.
我已经成功地将两个设备相互连接,并将简单的字符串从智能手机发送到蓝牙模块.但是我在读取从模块发回的数据时遇到了一些错误.我使用以下代码,与蓝牙聊天示例完全相同,从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;
}
}
Run Code Online (Sandbox Code Playgroud)
当我的蓝牙模块向手机发送一个简单的字符串时,没有正确接收该字符串.它以随机的方式分成几个部分.例如,如果我将三次"1234567890abcdef1234567890abcdef0123456789"发送到手机,Eclipse上的Logcat将记录这些:
mmInstream - 12345678910abcdef????????(continuing null)
mmInstream - 1????????(continuing null)
mmInstream - 2345678910abcdef0123456789????????(continuing null)
Run Code Online (Sandbox Code Playgroud)
首次.在第二次和第三次传输数据时,它会收到差异:
mmInstream - 1234567891???????(continuing null)
mmInstream - 0abcdef012???????(continuing null)
mmInstream - 3456789?????????(continuing null)
mmInstream - 1234567891????????????????(continuing null)
mmInstream - 0abcdef0123456789????????????(continuing null)
Run Code Online (Sandbox Code Playgroud)
我不知道为什么会发生这种情况以及如何解决这个问题.如果以这样的任意方式接收数据,我无法获得必要的数据来处理.我怎样才能把它整理成一件?
任何帮助,将不胜感激.
非常感谢.
Rad*_*adu 15
我注意到你的代码有两件事:
首先进一步发送到你的应用程序,你读取的缓冲区的引用并不总是一个很好的解决方案:如果在此期间缓冲区被覆盖怎么办?请参阅stackoverflow上的这个错误,例如 你可以通过制作你从蓝牙读取的数据副本(例如使用buffer.clone())来绕过这个,或者如果你不喜欢使用太多的内存,你可以使你的读缓冲区是循环的.
您应该能够重新编译数据,即使它是在单独的数据包中接收(但是在短时间内收到数据包).例如,您可以创建启动/停止标志.它仍然取决于您通过蓝牙发送的对象类型...
现在一个可能的解决方案,如果以前的2个警告没用,那就是:
而不是调用.read的无限循环 - 阻塞调用 - 你可以这样做:
while(true) {
if mmInStream.getAvailable()>0 {
-your read code here-
}
else SystemClock.sleep(100);
}
Run Code Online (Sandbox Code Playgroud)
这是一个黑客,它有时可能仍然只读取消息的某些部分 - 但它将是非常罕见的!
如果有用,请投票/更正!
| 归档时间: |
|
| 查看次数: |
19845 次 |
| 最近记录: |