从蓝牙缓冲区获取字符串

时间:2015-01-09 09:45:39

标签: android bluetooth

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

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

start_byte(1byte)/ battery _level(1byte)/ speed(1byte)/ mode(1byte)

所以我会收到一个这样的字符串(我将它放在十六进制中):

80464B11

每50ms。

这是代码。首先,这是 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,然后检查其他值。

但这是我的怀疑。这个字符串将每50ms收到一次,所以我会收到这样的信息:

80464B1180464B1180464B1180464B1180464B1180464B1180464B1180464B1180464B11 ...

所以,我要检查start_byte是做什么的:

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

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

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

我的方法是正确的吗?不知道缓冲区溢出了吗?如何正确检查start_byte以获取其他值?

2 个答案:

答案 0 :(得分:0)

也许只使用read()函数是有用的。此函数阻塞,直到读取一个字节。所以你可以做这样的事情:

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

所以现在你的字符串被存放在一个存储在数组中的4个int中。

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

答案 1 :(得分:0)

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

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

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

然后,当我想要他们时,我做了:

byte readed_byte = dataQueue.pop();

这样每次pop()时我都会从队列的头部得到一个字节。