當前位置:編程學習大全網 - 源碼下載 - android 藍牙如何發送十六進制數據

android 藍牙如何發送十六進制數據

與藍牙模塊通信最重要的地方就是數據的發送和接收,因為是底層的操作,所以更多是發送16進制數據。

進制轉換是我們程序員的必修課,屬於基本素質。這裏需要的是將字節數組轉化為16進制字符串,方法都是通用的:

[java] view plain copy

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;

}

接下來就是發送數據。

發送數據非常簡單,之前有關於藍牙編程的博文已經講到了,blogs.com/wenjiang/p/3200138.html,這裏只講重要的壹點:大容量字節數組的發送。

我們需要發送64個字節的數組,如果壹次性發送過去,單片機那裏可能無法及時處理以致沒有任何回應,因為單片機那裏是設置了數據接收的延時時間。要想暢通的與藍牙模塊通信,考慮這個時間差非常重要。調整字節的發送速率,就成為非常關鍵的壹步。值得註意的是,數據的發送是非常快的,就是因為這樣才會導致單片機那裏無法及時處理,所以,每次發送後的延時是非常重要的。我們單片機那裏的延時是10毫秒,所以我們選擇發送完每個字節後就延時10毫秒再發下個字節。

[java] view plain copy

for (byte b : bytes) {

out.write(b);

Thread.sleep(10);

}

具體的延時時間和字節發送速率得看單片機那裏程序的設置。

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

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

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

出現0個的情況就是單片機那邊沒有響應或者字節還沒發送過來,這時我們就需要壹個循環來保證我們能夠拿到數據:

[java] view plain copy

int count = 0;

while (count == 0) {

count = in.available();

}

byte[] bytes = new byte[count];

in.read(bytes);

但像是上面的90個字節的情況就是字節遺漏。對於這種情況,解決方法也很簡單:

[java] view plain copy

byte[] bytes = new byte[count];

int readCount = 0; // 已經成功讀取的字節的個數

while (readCount < count) {

readCount += in.read(bytes, readCount, count - readCount);

}

  • 上一篇:ApacheKafka開源消息系統_kafka源碼分析
  • 下一篇:vb讀寫ini文件
  • copyright 2024編程學習大全網