在Android上的蓝牙中从InputStream读取数据时出错

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)

这是一个黑客,它有时可能仍然只读取消息的某些部分 - 但它将是非常罕见的!

如果有用,请投票/更正!