AndroidSerialPort:安卓串列埠通訊庫

AIll發表於2018-10-08

AndroidSerialPort

Android 串列埠通訊,基於谷歌官方android-serialport-api編譯


github地址:github.com/AIlll/Andro…


使用說明

  1. 在Module下的 build.gradle 中新增
//最新版本檢視github專案
implementation 'com.aill:AndroidSerialPort:x.x.x'
複製程式碼
  1. 開啟串列埠
/**
 * @param 1 串列埠路徑
 * @param 2 波特率
 * @param 3 flags 給0就好
 */
SerialPort serialPort = new SerialPort(new File("/dev/ttyS1"), 9600, 0);
複製程式碼
  1. 往串列埠中寫入資料
//從串列埠物件中獲取輸出流
OutputStream outputStream = serialPort.getOutputStream();
//需要寫入的資料
byte[] data = new byte[x];
data[0] = ...;
data[1] = ...;
data[x] = ...;
//寫入資料
outputStream.write(data);
outputStream.flush();
複製程式碼
  1. 讀取串列埠資料

讀取資料時很可能會遇到分包的情況,即不能一次性讀取正確的完整的資料

解決辦法:可以在讀取到資料時,讓讀取資料的執行緒sleep一段時間,等待資料全部接收完,再一次性讀取出來。這樣應該可以避免大部分的分包情況

//從串列埠物件中獲取輸入流
InputStream inputStream = serialPort.getInputStream();
//使用迴圈讀取資料,建議放到子執行緒去
while (true) {
    if (inputStream.available() > 0) {
        //當接收到資料時,sleep 500毫秒(sleep時間自己把握)
        Thread.sleep(500);
        //sleep過後,再讀取資料,基本上都是完整的資料
        byte[] buffer = new byte[inputStream.available()];
        int size = inputStream.read(buffer);
    }
}
複製程式碼
  1. 修改裝置su路徑

開啟串列埠時,會檢測讀寫許可權,當沒有許可權時,會嘗試對其進行提權

//預設su路徑是/system/bin/su,有些裝置su路徑是/system/xbin/su
//在new SerialPort();之前設定su路徑
SerialPort.setSuPath("/system/xbin/su");
複製程式碼

  • ByteUtil類:工具類,字串轉位元組陣列,位元組陣列轉字串
  • SerialFinder類:用於查詢裝置下所有串列埠路徑

github地址:github.com/AIlll/Andro… ,如對你有幫助,求給個start哦,如有問題以及更好的建議,歡迎提出來相互交流

相關文章