从蓝牙缓冲区获取字符串
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() 时都会从队列的头部获取一个字节。
我正在开发一个通过蓝牙与 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() 时都会从队列的头部获取一个字节。