Android蓝牙立即发送连锁数据

时间:2015-07-01 08:43:50

标签: android bluetooth

我正在使用蓝牙聊天应用程序代码在两个Android设备之间传输数据。 但是代码正在发送连锁数据。 例如:当我尝试发送如下数据时:

  1. 一个
  2. B'/ LI>
  3. C
  4. d
  5. 有时以这种形式发送数据:

    1. 一个
    2. BC
    3. d
    4. 以下是我发送数据的编写代码:

      public synchronized void write(byte[] buffer) {
              try {
                  mmOutStream.write(buffer);
      
                  mHandler.obtainMessage(BluetoothHelper.MESSAGE_WRITE, -1, -1, buffer)
                          .sendToTarget();
                  mmOutStream.flush();
              } catch (IOException e) {
                  Log.e(TAG, "Exception during write", e);
              }
          }
      

      我的阅读代码也是:

      if (mmInStream.available()>0){
                          bytes = mmInStream.read(buffer);
                          mHandler.obtainMessage(BluetoothHelper.MESSAGE_READ, bytes, -1, buffer)
                                  .sendToTarget();
                      }else {
                          SystemClock.sleep(100);
                      }
      

      我尝试了冲洗和睡眠,但他们没有解决问题。请帮忙。

1 个答案:

答案 0 :(得分:1)

由于两个不同线程的执行速度不同,正在进行串联。

一个是UI线程(您的Android应用程序),即正在查看通过蓝牙接收的数据的位置。 UI线程刷新是通过以下行。

mHandler.obtainMessage(BluetoothHelper.MESSAGE_READ, bytes, -1, buffer)
                        .sendToTarget();

第二个线程是收集通过蓝牙链接接收的数据的线程。通过蓝牙接收数据的代码是:

mmInStream.read(buffer);

这是一个阻止呼叫,即仅在通过蓝牙接收到某些内容时返回。

UI线程比通过蓝牙线程接收的数据相对缓慢地刷新视图。这意味着下次刷新UI视图时,BT读取线程上可能已经收到多个字符。因此,似乎数据连接在一起。这个连接将是随机的,并且随机数字符串连接。

要解决此问题:

1)发送时:发送字符(或数据包),后跟分隔符。

2)接收时:只有在收到接收到分隔符的字符(或数据包)之后才将消息发送到UI。这意味着每次阻塞调用mmOutStream.write(buffer)返回后,你必须累积接收字符并验证这些累积的缓冲区。

Have a look at this question and answer provided therein.