天天看點

android 藍牙程式設計重點---如何發送和接收16進制資料

與藍牙子產品通信最重要的地方就是資料的發送和接收,因為是底層的操作,是以更多是發送16進制資料。

進制轉換是我們程式員的必修課,屬于基本素質。這裡需要的是将位元組數組轉化為16進制字元串,方法都是通用的:

     接下來就是發送資料。

     發送資料非常簡單,之前有關于藍牙程式設計的博文已經講到了,http://www.cnblogs.com/wenjiang/p/3200138.html,這裡隻講重要的一點:大容量位元組數組的發送。

     我們需要發送64個位元組的數組,如果一次性發送過去,單片機那裡可能無法及時處理以緻沒有任何回應,因為單片機那裡是設定了資料接收的延時時間。要想暢通的與藍牙子產品通信,考慮這個時間差非常重要。調整位元組的發送速率,就成為非常關鍵的一步。值得注意的是,資料的發送是非常快的,就是因為這樣才會導緻單片機那裡無法及時處理,是以,每次發送後的延時是非常重要的。我們單片機那裡的延時是10毫秒,是以我們選擇發送完每個位元組後就延時10毫秒再發下個位元組。

具體的延時時間和位元組發送速率得看單片機那裡程式的設定。

     在使用inputstream的時候,必須注意,inputstream的讀取是阻塞的。這點在一般的情況下是不會影響到我們的程式,但是記住這個情況對于代碼的設計是非常重要的,尤其是在考慮使用者體驗的時候。

     無參數的read()是每次隻從流中讀取一個位元組,這種做法效率非常低,但是簡單,像是讀取整數值這種情況,使用read()就非常好,但如果是16進制字元串呢?使用inputstream.read(byte[] b)或者inputstream.read(byte[] b,int off,int len)方法,這樣一次就能讀取多個位元組。

      如果是讀取多個位元組,我們常常使用inputstream.available()方法來擷取資料流中可讀位元組的個數。讀取本地資料的時候,該方法發揮得非常好,但如果是讀取非本地資料,就可能出現位元組遺漏的問題,像是要讀取100個位元組,可能就是90個,甚至是0個。

      出現0個的情況就是單片機那邊沒有響應或者位元組還沒發送過來,這時我們就需要一個循環來保證我們能夠拿到資料:

但像是上面的90個位元組的情況就是位元組遺漏。對于這種情況,解決方法也很簡單:

繼續閱讀