Android通過藍芽與微控制器(HC-05)進行通訊,接收資料
阿新 • • 發佈:2019-02-09
怕忘
藍字是連結,開啟會有更多驚喜。
- 首先,可以明確的是,與微控制器進行通訊的時候,會很明確的知道是有多少個數據;
所以我們就可以根據其長度設定要存取的byte[]長度; - 其次,藍芽的接收和傳送試藥建立在獨立執行緒裡面的;
搜尋和配對/通訊(後來在某篇部落格裡面發現,說是和微控制器通訊的話可以直接連線,完了可以試試) - 再之,就是和微控制器通訊的時候,它傳送的都是16進位制的東西,所以要麼轉換,要麼直接用byte[];
- 最後,讀取的時候,InputStream有read(),read(byte[] b),read(byte[] b,int off,int len),可以參考↓使用;
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一下。
以上。