該博文是博主第一次接觸串口通信做的筆記,并沒有詳細地解析SerialPort類和SerialPortFinder類队丝,如果感興趣的話,可以參考Android串口通信:抱歉,學(xué)會它真的可以為所欲為鹃愤,解釋的挺詳細的!
1. 介紹
首先來了解一下什么是串口:
串口即串行接口完域,也稱串行通信接口或串行通訊接口(通常指COM接口)软吐,是采用串行通信方式的擴展接口。串行接口 (Serial Interface) 是指數(shù)據(jù)一位一位地順序傳送吟税,其特點是通信線路簡單凹耙,只要一對傳輸線就可以實現(xiàn)雙向通信(可以直接利用電話線作為傳輸線)姿现,從而大大降低了成本,特別適用于遠距離通信肖抱,但傳送速度較慢备典。
———— 摘自百度百科
在Android中,我們可以調(diào)用Unix的動態(tài)連接庫(.so
擴展名文件)來集成串口通信意述,這種調(diào)用的方式稱為JNI(Java Native Interface熊经,即Java本地接口)。
Google安卓官方已經(jīng)提供了android-serialport-api 官方API欲险,項目的具體結(jié)構(gòu)如下:
- jni中存放了JNI調(diào)用的C/C++文件镐依。
- libs存放了
.so
文件,是由C/C++編譯而來的天试。 - src中的
SerialPort.java
和SerialPortFinder.java
是提供Java開發(fā)的類槐壳。
2. 集成項目
我們創(chuàng)建SerialPortDemoApp項目,將android-serialport-api項目中的jni和libs文件夾與android-serialport-api
文件夾分別移動到SerialPortDemoApp中的app與src/main/java目錄下喜每,如下圖所示:
然后配置app/build.gradle
务唐,設(shè)置.so
文件的路徑:
android {
...
}
sourceSets.main {
jniLibs.srcDir 'libs'
}
}
這樣,我們就可以在Android進行開發(fā)串口的通信了带兜。
3. 簡單收發(fā)
3.1 接收
首先我們初始化SerialPortFinder枫笛,并創(chuàng)建SerialPort,打開串口:
mSerialPortFinder = new SerialPortFinder();
// 得到所有設(shè)備文件地址的數(shù)組
// 實際上該操作并不需要刚照,這里只是示例打印出所有的設(shè)備信息
String[] entryValues = mSerialPortFinder.getAllDevicesPath();
try {
// 打開/dev/ttyUSB0路徑設(shè)備的串口
mSerialPort = new SerialPort(new File("/dev/ttyUSB0"), 9600, 0);
} catch (IOException e) {
System.out.println("找不到該設(shè)備文件");
}
這樣刑巧,我們可以從SerialPort
對象中得到輸入流,并開啟一個子線程進行讀取該設(shè)備傳入的串口數(shù)據(jù):
final InputStream inputStream = mSerialPort.getInputStream();
/* 開啟一個線程進行讀取 */
new Thread(new Runnable() {
@Override
public void run() {
try {
byte[] buffer = new byte[1024];
int size = inputStream.read(buffer);
byte[] readBytes = new byte[size];
System.arraycopy(buffer, 0, readBytes, 0, size);
System.out.println("received data => " + new String(readBytes));
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
3.1 發(fā)送
發(fā)送數(shù)據(jù)時无畔,我們只需要從SerialPort
對象中得到OutputStream
對象啊楚,寫入字節(jié)數(shù)組數(shù)據(jù)即可:
// 開啟子線程進行發(fā)送數(shù)據(jù)
new Thread(new Runnable() {
@Override
public void run() {
String content = "Hello World";
byte[] bytes = content.getBytes();
OutputStream out = mSerialPort.getOutputStream();
// 寫入數(shù)據(jù)
try {
out.write(bytes);
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
最后,可以看到這樣進行串口通信的開發(fā)并不方便浑彰,需要自己創(chuàng)建線程恭理,沒有很好地處理其中的異常,我推薦大家可以參考一下GitHub上的AndroidSerialPort項目郭变,代碼很簡單颜价,使用也很方便!