2015-07-01 3 views
0

Я использую код приложения Bluetooth Chat для передачи данных между двумя устройствами Android. Но код отправляет конкатенированные данные. Например: При попытке отправить данные, как показано ниже:Android Bluetooth отправляет конкатенированные данные сразу

  1. б
  2. с
  3. д

Это иногда посылать данные в этой форме:

  1. a
  2. Ьс
  3. d

Вот мой код записи для передачи данных:

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

Конкатенация происходит из-за разницы в скорости выполнения двух разных потоков.

Один из них - это пользовательский интерфейс (приложение для Android), то есть когда просматриваются данные, полученные по Bluetooth. Обновление потока пользовательских интерфейсов осуществляется по следующей строке.

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

И второй поток является тем, который собирает данные, полученные по каналу связи Bluetooth. код получения данных через Bluetooth является:

mmInStream.read(buffer); 

Это блокирующий вызов, то есть возвращается только тогда, когда что-то принимается по Bluetooth.

Пользовательский интерфейс обновляет представление сравнительно медленно, чем данные, полученные по потоку Bluetooth. Это означает, что к тому времени, когда в следующий раз будет отображаться представление пользовательского интерфейса, более нескольких символов могут быть уже получены в потоке чтения BT. Следовательно, представляется, что данные конкатенированы. И эта конкатенация будет случайным образом и со случайными численными символами.

Чтобы решить эту проблему:

1) При передаче: Передача символа (или пакет), а затем с помощью символа-ограничителя.

2) И при приеме: отправить сообщение в пользовательский интерфейс только после того, как он заключил, что получен символ (или пакет), за которым следует разделитель. Это означает, что вам придется аккумулировать принимающие символы и проверять накопленный буфер каждый раз после того, как будет вызван блокирующий вызов mmOutStream.write (buffer).

Have a look at this question and answer provided therein.

Смежные вопросы