【问题标题】:Data Transmisison error using SPP over Bluetooth on Android在 Android 上通过蓝牙使用 SPP 的数据传输错误
【发布时间】:2011-03-31 08:46:00
【问题描述】:

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

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

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

【问题讨论】:

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

标签: android bluetooth rfcomm


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    解决方法是在连接线程中直接在 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);
                }
    

    【讨论】:

    • 蓝牙聊天示例在其原始实现中的问题在于,如果它用于以比人类打字速度更快的速度接收字符,您将开始看到字符丢失或明显重复。原因非常简单:通过Handler 将引用传递给UI 的byte[] 数组很快就会被后续.read() 操作中的新字符填充。因此,您确实需要在连接的Thread 和处理接收数据的任何对象之间实现某种循环缓冲区。
    • @Trevor & @@MortalToaster,非常感谢。已经为此苦苦挣扎了一段时间。
    猜你喜欢
    • 1970-01-01
    • 2017-12-14
    • 2015-09-02
    • 2013-01-08
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多