- 首先,可以明确的是,与单片机进行通信的时候,会很明确的知道是有多少个数据;
所以我们就可以根据其长度设置要存取的byte[]长度; - 其次,蓝牙的接收和发送试药建立在独立线程里面的;
搜索和配对/通信(后来在某篇博客里面发现,说是和单片机通信的话可以直接连接,完了可以试试) - 再之,就是和单片机通信的时候,它发送的都是16进制的东西,所以要么转换,要么直接用byte[];
- 最后,读取的时候,InputStream有read(),read(byte[] b),read(byte[] b,int off,int len),可以参考↓使用;
read()和read(byte[] b)
read(byte[] b,int off,int len)
while(true){
try {
num = inputStream.read(buffer_z);//buffer_z和buffer_z_new都是1024
n=0;
for(i=0;i<num;i++){
buffer_z_new[n] = buffer_z[i];
n++;
}
String s =bytesToHexString(buffer_z_new);//因为单片机发出的是16进制的,直接读取会是乱码,于是进行了转换。
smsg+=s.trim();
if(inputStream.available()==0)break;//有时候会因为某些原因,会出现有数据但是位0的问题,可以尝试添加延时;
} catch (IOException e) {
e.printStackTrace();
}
}
public static String bytesToHexString(byte[] bytes) {
String result = "";
for (int i = 0; i < bytes.length; i++) {
String hexString = Integer.toHexString(bytes[i] & 0xFF);
if (hexString.length() == 1) {
hexString = '0' + hexString;
}
result += hexString.toUpperCase();
}
return result;
}
但是以上读取的时候,有时候会出现丢包的现象,后来再百般询问,浏览之后,得到的结论是:
如果ble需要对事件广播进行监听;如果只是普通蓝牙直接使用接口函数即可,但是需要使用循环(for)不断读一个字节的函数,不能直接读一串。
比如:
int i = 0,size = 0;
byte[] oneByte = new byte[1];
for(i = 0; i< 64386;i++){
//读后面所有数据
size = inputStream.read(oneByte, 0, 1);
if (size != 1)
{
return;
}
bufData[i] = oneByte[0];//将循环出来的每一个字节存放在总byte[]里面。
}
- 如果出现大量的0的时候,可以尝试让线程sleep一下。
以上。