1. 程式人生 > >Android通過藍芽與微控制器(HC-05)進行通訊,接收資料

Android通過藍芽與微控制器(HC-05)進行通訊,接收資料

怕忘

藍字是連結,開啟會有更多驚喜。

  • 首先,可以明確的是,與微控制器進行通訊的時候,會很明確的知道是有多少個數據;
    所以我們就可以根據其長度設定要存取的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一下。

以上。