实现用于Android蓝牙通信的BlockingQueue Buffer

时间:2012-01-01 14:14:16

标签: android bluetooth buffer blockingqueue

我真的很难过这个,我试图调试过去的三天。希望有人能够告诉我我做错了什么。

我正在实现一个BlockingQueue(FIFO)缓冲区来接收通过蓝牙从我的PC上流式传输的信息。我正在使用RealTerm在超级终端链路上发送预先录制的心电图信号。

我通过添加值然后删除它来启动应用程序时测试了缓冲区,它似乎可以正常工作。

当我从蓝牙连接接收数据时尝试存储在缓冲区中时出现问题。我不知道我的加入速度是否比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;
            }
        }
    }

所以我的问题的一个例子是:

通过蓝牙连接发送值(8位值从1到20)。在IncomingBuffer类的insert方法中,日志消息确认发送了正确的值。当从缓冲区中检索值时,它包含20个字节的数组,这些数组都包含插入的最后一个数字(20)。

关于为什么缓冲区在其他情况下工作但在蓝牙通信期间不工作的任何线索?

1 个答案:

答案 0 :(得分:1)

我弄清楚我的问题是什么。

当我使用变量buffermmInStream读取然后将其传递给ringBuffer时,每次通过while循环时都会传递相同的字节数组变量。根据我的理解,只需指定计算字节数组的特定内存位置,这就是为什么最后我ringBuffer中的所有元素都是mmInStream中分配给'缓冲区'的最后一个值。 {1}}。

我做的改变是做一个单独的变量,我克隆'缓冲'字节数组。在我将'buffer'传递给'RingBuffer'之前,我会执行以下操作:

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

这可以解决我的问题。