背景:我现在在做手机端与单片机通过蓝牙进行数据传递。
问题:在我通过蓝牙接收单片机通过串口发来的数据的时候,出现了:
1:大量为0的无用数据;
2:缺失部分数据;
接收代码如下。
while(true){
try {
num = inputStream.read(buffer_z);
n=0;
for(i=0;i<num;i++){
buffer_z_new[n] = buffer_z[i];
n++;
}
String s =bytesToHexString(buffer_z_new);
smsg+=s.trim();
if(inputStream.available()==0)break;
} catch (IOException e) {
e.printStackTrace();
}
}
StringBuffer stringBuffer = new StringBuffer();
String a = smsg.replace("FB0000",",");
String[] b = a.split(",");
String c = b[1].replace("1000",",");
String[] d = c.split(",");
stringBuffer.append(d[1]);
String ends = stringBuffer.toString();
Message msg = new Message();
Bundle data = new Bundle();
data.putByteArray("bytes",ends.getBytes());
msg.what = MainActivity.ACCEPT_MESSAGE;
msg.setData(data);
handler.sendMessage(msg);
我该如何解决呢?
我在字符串截取操作中将在数据一开始出现的大量为0的无用数据截取掉了,现在的遗留的问题是:数据的缺失。
一开始我发送handler的是obtainMessage,后来发现这个方法虽然效率快但是或会发现数据缺失问题,但是我改用sendMessage之后,数据缺失问题
依然没有改变。
我该怎么去处理呢?
数据流并不是连续的,在接收第一帧数据后,你使用break跳出了while(true)循环,后面的数据就没有了
你这个问题我也遇到过:
1.大量为0的无用数据应该是你的byte数组声明的长度太大了,这样没有数据的部分默认就是0,你可以这样声明的byte数组
byte [] b = new byte[inputStream.available()];
2.数据丢失问题有可能是蓝牙分段传输了,也可能是丢包了,分段问题你可以让单片机设备研发人员把给你发送的数据加上很好区别的头和尾,这样你就可以知道你收到的是否是一条完整的数据,如果不是就先把这个数组缓存起来,这样就可以解决了,丢包问题可能就是蓝牙设备连接不太稳定了。