Реализация BlockingQueue Buffer, используемого в Bluetooth Communication для Android - PullRequest
2 голосов
/ 01 января 2012

Я действительно озадачен этим и пытаюсь отладить за прошедшие три дня.Надеюсь, кто-нибудь сможет сказать мне, что я делаю неправильно.

Я использую буфер 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;
            }
        }
    }

Примером моей проблемы может быть:

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

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

1 Ответ

1 голос
/ 03 января 2012

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

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

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

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

Это решает мою проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...