我正在开发一款通过蓝牙与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以获取其他值?
答案 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()时我都会从队列的头部得到一个字节。