Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android上使用蓝牙SPP进行数据传输时出错_Android_Bluetooth_Rfcomm - Fatal编程技术网

Android上使用蓝牙SPP进行数据传输时出错

Android上使用蓝牙SPP进行数据传输时出错,android,bluetooth,rfcomm,Android,Bluetooth,Rfcomm,我在安卓系统中通过蓝牙使用RFCOMM套接字时遇到了数据完整性问题。我没有任何连接问题,但我收到的数据是乱码,与发送的数据不一样。数据由RS232设备通过蓝牙适配器发送,手机连接到蓝牙适配器。适配器没有问题,因为如果我连接笔记本电脑,数据会被正确接收 我的蓝牙连接是根据Android开发者网站上的示例应用程序处理的,没有任何更改。发送的数据是纯文本和控制字符,在显示给用户之前会去掉这些字符。我遇到的具体问题是,有些文本缺失,有些重复,等等。 有趣的是,如果我连接到一台带有终端应用程序的计算机,并

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

我的蓝牙连接是根据Android开发者网站上的示例应用程序处理的,没有任何更改。发送的数据是纯文本和控制字符,在显示给用户之前会去掉这些字符。我遇到的具体问题是,有些文本缺失,有些重复,等等。 有趣的是,如果我连接到一台带有终端应用程序的计算机,并在那里输入,数据就可以很好地传输。此外,如果我使用应用程序连接到设备,则数据接收良好


因此,我想问题在于GetBlue在处理蓝牙数据传输时可能做了哪些不同的工作,或者是否有其他方法通过Android上的RFCOMM套接字接收蓝牙数据?

解决方案的解决方案是在调用InputStream上的read之后,直接在连接的线程中创建字符串,然后将字符串传递回主线程进行显示。无论出于何种原因,在线程之间传递字节数组都会导致大量重复和数据丢失

修改的运行代码:

    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);
            }

此错误是因为如果将byte arraybuffer复制到另一个字节数组,则对象引用会传递到UI。我认为部分问题与线程有关,因为在流中读取的函数位于单独的线程上。此外,数据发送速度也很快。蓝牙聊天示例在其原始实现中存在的问题是,如果它用于以比人类打字速度更快的速度接收字符,您将开始看到字符丢失或明显重复。原因非常简单:字节[]数组的引用通过处理程序传递给UI,很快就会被后续的.read操作中的较新字符填充。因此,您确实需要在连接的线程和处理接收数据的任何线程之间实现某种循环缓冲区。@Trevor&@@Toaster,非常感谢。我和它斗争了很长一段时间。