11

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

我的蓝牙连接是根据Android 开发者网站 ( http://developer.android.com/resources/samples/BluetoothChat/index.html ) 上的BluetoothChat示例应用程序处理的,没有任何更改。发送的数据是纯文本和控制字符(在显示给用户之前被剥离)。我遇到的具体问题是一些文本丢失,一些重复等等。有趣的是,如果我用终端应用程序连接到计算机并在那里输入,数据传输良好。此外,如果我使用GetBlue应用程序连接到设备,则可以正常接收数据。

所以我想问题是 GetBlue 可能在处理其蓝牙数据传输方面有什么不同,或者是否有另一种方式通过 Android 上的 RFCOMM 套接字接收蓝牙数据?

4

2 回答 2

10

解决方案的修复是在连接的线程中创建字符串,直接在 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);
            }
于 2010-08-19T05:53:19.050 回答
2

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

于 2013-04-01T10:29:12.600 回答