1. 程式人生 > >用android_serialport_api遇到的問題以及解決方法

用android_serialport_api遇到的問題以及解決方法

最近用Android系統做串列埠的專案,用到了開源的android_serialport_api庫。在用這個庫遇到了各種問題,各種坑。在這總結一下。

1、引入so庫
把android_serialport_api中的jni和libs兩個檔案拷到專案中,如圖所示
這裡寫圖片描述

2、找不到so

 要解決這個問題,要在build.gradle的android標籤中加入如下程式碼
 sourceSets{
        main(){
            jniLibs.srcDirs = ['libs']
        }
    }

3、包名的問題
這裡寫圖片描述

4、資料接收不完整


在接收資料的時候,發現數據總是接收不完整。後來經過除錯發現一條資料有時候不是一次接收完,有可能分幾次來接收(為什麼會這樣子,我也不太清楚,希望哪位大神幫我解決一下)。為了解決問題就要規範資料的傳輸協議,必須要包含包頭和包尾。比如我的專案,每次傳5個位元組,包頭為0xff,包尾為0x11。定義一個list集合用來存接收到的資料,程式碼如下

class MyThread extends Thread {
        @Override
        public void run() {
            List<Byte> dataReceived = new ArrayList<>();
            while
(true) { int size; try { byte[] buffer = new byte[16]; if (mInputStream == null) continue; size = mInputStream.read(buffer); if (size > 0) { if (buffer[0] == 0x0f) { for
(int i = 0; i < size; i++) { if (buffer[i] == 0x11 && dataReceived.size() == 4) { //說明資料結束了 /資料接收完後,做你想做的事情 //最後記得清空集合 dataReceived.clear(); } else { //資料還沒結束,存入集合中 dataReceived.add(buffer[i]); } } } else { if (dataReceived.size() > 0 && (dataReceived.get(0) == 0x0f)) { for (int i = 0; i < size; i++) { if (buffer[i] == 0x11 && dataReceived.size() == 4) { //說明資料結束了 //資料接收完後,做你想做的事情 //最後記得清空集合 dataReceived.clear(); } else { //資料還沒結束,存入集合中 dataReceived.add(buffer[i]); } } } else { dataReceived.clear(); continue; } } } } catch (IOException e) { e.printStackTrace(); } } } }