用android_serialport_api遇到的問題以及解決方法
阿新 • • 發佈:2019-02-02
最近用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();
}
}
}
}