从蓝牙缓冲区获取字符串

Get String from bluetooth buffer

我正在开发一个通过蓝牙与 PCB 板通信的应用程序。

我每 50 毫秒从 PCB 板收到一个字符串到我的应用程序。该字符串具有下一个结构:

start_byte(1byte)/电池电量(1byte)/速度(1byte)/模式(1byte)

所以我会收到这样的字符串(我会用十六进制表示):

80464B11

每 50 毫秒。

这是代码。首先这是 ConnectedThread,它侦听通信并将接收到的消息发送到 mainActivity:

public void run() {
    byte[] buffer = new byte[1024];
    int readed;

    while (true) {
        try {
            readed = inputStream.read(buffer);
            if (readed > 0) {
                final byte[] temp = new byte [readed];
                System.arraycopy(buffer, 0, temp, 0, readed);

                activity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        /*Sends message to UI*/
                        connectionListener.msgRead(temp);
                    }
                });
            }
        } catch (IOException e) {
            ...
            break;
        }
    }

然后在 MainActivity 中,我对接收到的字符串进行操作以从中提取每个值。

@Override
public void msgRead(byte[] buffer) {
    String income = byteArrayToHex(buffer);
    ...

下一步是检查 start_byte,然后获取其他值。

但是我的疑问来了。该字符串将每 50 毫秒收到一次,因此我将收到如下内容:

80464B1180464B1180464B1180464B1180464B1180464B1180464B1180464B1180464B11...

所以,我检查 start_byte 的方法是:

String start_byte = income.substring(0,  2);

然后,如果它与 start_byte 值匹配,我将提取其余值:

if (start_byte.equals("80")) {
    ...

面对这种情况,我的做法是否正确?缓冲区不会溢出吗?如何正确检查 start_byte 以获得其他值?

也许只使用 read() 功能是有用的。在读取一个字节之前,此函数一直处于阻塞状态。所以你可以做这样的事情:

int[] yourArray = new int[4];
for(int i = 0; i < 4; i++)
{
   yourArray[i] = inputStream.read();
}

所以现在你的字符串被分配到存储在数组中的 4 个整数中。

也许这会以某种方式帮助你

我遇到过这样的问题。我在 ConnectedThread 中创建了一个队列。每次我收到一个 byte[] 我把它放入 Queue.

LinkedList<Byte> dataQueue = new LinkedList<Byte>();

int i = 0;
while (i< temp.length) {
    dataQueue.add(temp[i]);
    i++;
}

然后,当我想得到它们时,我会这样做:

byte readed_byte = dataQueue.pop();

这样我每次执行 pop() 时都会从队列的头部获取一个字节。