2012-01-01 2 views
2

Я действительно смущен этим, и я пытаюсь отлаживать за прошедшие три дня. Надеюсь, кто-то сможет сказать мне, что я делаю неправильно.Реализация BlockingQueue Buffer, используемого в Bluetooth Communication for Android

Я реализую буфер BlockingQueue (FIFO), чтобы получать информацию, передаваемую с моего ПК через Bluetooth. Я посылаю предварительно записанный сигнал электрокардиограммы по гипертерминальной ссылке, используя RealTerm.

Я протестировал буфер при запуске приложения, добавив значения, а затем удалив их, и, похоже, он работает так, как должен.

Проблема возникает, когда я пытаюсь сохранить в буфере, пока я получаю данные от соединения Bluetooth. Я не знаю, добавляю ли я быстрее, чем BlockingQueue может справиться, но когда я останавливаю передачу данных и проверяю свой буфер, весь буфер содержит последнее добавленное значение. Размер буфера правильный, но контент отсутствует.

Вот мой буфер:

public class IncomingBuffer { 

private static final String TAG = "IncomingBuffer"; 

private BlockingQueue<byte[]> inBuffer; 

public IncomingBuffer() { 
    inBuffer = new LinkedBlockingQueue<byte[]>(); 
    Log.i(TAG, "Initialized"); 
} 

public int getSize() { 
    int size; 
    size = inBuffer.size(); 
    return size; 
} 

// Inserts the specified element into this queue, if possible. Returns True 
// if successful. 
public boolean insert(byte[] element) { 
    Log.i(TAG, "Inserting " + element[0]); 

    boolean success = inBuffer.offer(element); 
    return success; 

} 

// Retrieves and removes the head of this queue, or null if this queue is 
// empty. 
public byte[] retrieve() { 
    Log.i(TAG, "Retrieving"); 
    return inBuffer.remove(); 

} 

// Retrieves, but does not remove, the head of this queue, returning null if 
// this queue is empty. 
public byte[] peek() { 

    Log.i(TAG, "Peeking"); 
    return inBuffer.peek(); 
} 
} 

Часть моего класса BluetoothCommunication, который получает информацию и отправляет его в буфер заключается в следующем:

public void run() { 
     Log.i(TAG, "BEGIN mConnectedThread"); 
     ringBuffer = new IncomingBuffer(); 

     byte[] buffer = new byte[1024]; 
     Log.i(TAG, "Declared buffer byte"); 

     int bytes; 

     byte[] retrieve; 
     int size; 

     Log.i(TAG, "Declared int bytes"); 
     //Setting up desired data format 8 
     write(helloworld); 
     Log.i(TAG, "Call write(initialize)"); 

     // Keep listening to the InputStream while connected 
     while (true) { 
      try { 
       Log.i(TAG, "Trying to get message"); 
       // Read from the InputStream 
       bytes = mmInStream.read(buffer); 

       //THIS IS WHERE THE BYTE ARRAY IS ADDED TO THE IncomingBuffer 
       RingBuffer.insert(buffer); 

       // Send the obtained bytes to the UI Activity 
       mHandler.obtainMessage(MainActivity.MESSAGE_READ, bytes, -1, buffer) 
         .sendToTarget(); 

       Log.i(TAG, "Sent to target" +ringBuffer.getSize()); 
      } catch (IOException e) { 
       Log.e(TAG, "disconnected", e); 
       connectionLost(); 
       // Start the service over to restart listening mode 
       BluetoothCommService.this.start(); 
       break; 
      } 
     } 
    } 

Так пример моей проблемы будет be:

Отправлять значения по соединению Bluetooth (8 бит от 1 до 20). В методе вставки класса IncomingBuffer сообщение журнала подтверждает, что отправлено правильное значение. Когда значения извлекаются из буфера, он содержит двадцать байт-массивов, которые содержат последний вставленный номер (20).

Любая подсказка относительно того, почему буфер работал бы в других обстоятельствах, но не во время связи с Bluetooth?

ответ

1

Я понял, в чем была моя проблема.

Когда я использовал переменную buffer для чтения из mmInStream, а затем передать, что к ringBuffer, я передать тот же переменный массив байт каждый раз, когда я пройти через цикл. Из того, что я могу понять, просто присваивается определенная ячейка памяти, в которой вычисляется массив байтов, и поэтому в конце все элементы в моем ringBuffer являются последним значением, которое было присвоено «буфером» из mmInStream.

Что я сделал для изменения, это сделать отдельную переменную, к которой я клонирую массив байтов 'buffer'. Прежде чем передать «буфер» в «RingBuffer», я делаю следующее:

byte[] newBuf; 
newBuf = buffer.clone(); 
ringBuffer.store(newBuf); 

Это касается моей проблемы.

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