问题 在Android上使用SPP而不是蓝牙的数据传输错误


我在使用Android上的蓝牙RFCOMM插槽时遇到了数据完整性问题。我连接没有任何问题,但我收到的数据是乱码,与发送的数据不同。数据由RS232设备通过手机连接的蓝牙适配器发送。适配器没有问题,因为如果我连接笔记本电脑,数据会被正确接收。

我的蓝牙连接是基于 BluetoothChat 在Android开发者网站上找到的示例应用程序(http://developer.android.com/resources/samples/BluetoothChat/index.html),没有变化。发送的数据是纯文本和控制字符(在显示给用户之前被删除)。我遇到的具体问题是缺少一些文本,其中一些文本被重复,等等。 有趣的是,如果我连接到具有终端应用程序的计算机并输入,那么数据传输正常。另外,如果我使用连接到设备 GetBlue进行 应用程序数据收到罚款。

所以我想问题是GetBlue可能做些什么来处理其蓝牙数据传输,或者是否有其他方式通过Android上的RFCOMM插槽接收蓝牙数据?


11886
2017-08-18 05:19


起源

我认为问题的一部分与线程有关,因为读取流的函数在一个单独的线程上。此外,数据正在快速发送。 - MortalToaster


答案:


解决方案的修复是在连接线程中创建字符串,直接在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);
            }

9
2017-08-19 05:53



蓝牙聊天示例在其原始实现中的问题在于,如果它用于以比人类打字速度更快的速度接收字符,您将开始看到字符丢失或显然重复。原因很简单:byte []数组,其引用通过传递给UI Handler 很快就会被随后的新角色所填充 .read() 操作。因此,您确实需要在连接之间实现某种循环缓冲 Thread 以及处理接收数据的任何内容。 - Trevor
@Trevor&@@ MortalToaster,非常感谢。已经挣扎了很长一段时间。 - Sam Rad


此错误是因为对象引用传递给UI,如果将字节数组(缓冲区)复制到另一个字节数组,它就可以工作。


2
2018-04-01 10:29