Я действительно озадачен этим и пытаюсь отладить за прошедшие три дня.Надеюсь, кто-нибудь сможет сказать мне, что я делаю неправильно.
Я использую буфер 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?