Android串口通信apk源碼詳解(附完整源碼)

1、SerialPortHelper「Android串口通信」介紹

原項目地址

https://github.com/freyskill/SerialPortHelper

Android串口通訊助手可以用於需要使用串口通信的Android外設,該庫有如下特點:

1、串口通信部分使用C++實現,在筆者接觸的部分設備上實測,使用C++實現與Google官方提供的Demo的方式要快;

2、支持且必須設置串口接收最大數據長度,初始化庫時填入該參數,這樣設置的原因是考慮在實際使用中,規定的串口通信協議格式一般會固定有最大長度,方便對數據進行處理;

3、支持命令一發一收,通過對串口的讀寫線程進行同步控制,命令會先加入到隊列然後依次發送和接收,前提需要設置超時時間以及超時處理,參考下面第4、5點;

4、支持超時設置,設置超時時間後,如果命令在設置的時間內未反饋,則會根據設置的操作進行重發或退出該命令;

5、支持超時重發(可以N次重發,具體按需設置)與退出,退出會調用接收回調的 onComplete 方法。

2、運行apk演示

使用該庫簡單實現的串口調試助手工具,原來作者編譯的版本有點問題,點擊發送的時候會死掉,我重新修改瞭一份,大傢在使用的時候如果有什麼問題,可以提出來。

使用界面

串口apk使用界面

數據收發界面

3、Apk 下載地址

APK下載-SerialPortHelperV1.0.1-20201225.apk

https://github.com/freyskill/SerialPortHelper/blob/master/SerialPortHelperV1.0.1.apk

如果github下載比較慢

鏈接: https://pan.baidu.com/s/1GqR7taCh-iOqOU_57OSRtg 提取碼: qrhj

4、軟件接入方式

Step 1. Add the JitPack repository to your build file

Add it in your root build.gradle at the end of repositories:

allprojects {
 repositories {
 ...
 maven { url 'https://www.jitpack.io' }
 }
}

Step 2. Add the dependency

dependencies {
  implementation 'com.github.freyskill:SerialPortHelper:v1.0.1'
}

5、使用說明

初始化需要設置maxSize,也可以設置isReceiveMaxSize該參數默認為false,詳細說明如下:

int maxSize;  // 設置串口讀取的最大數據長度

boolean isReceiveMaxSize; // 設置是否接收命令按最大長度進行返回,比如串口協議定義的格式長度為16個字節,這樣可以設置maxSize為16,然後設置該參數為true,則接收的命令就會返回16個字節的長度。

提示: 設置isReceiveMaxSize為true是為瞭處理命令返回不完整的情況,例如完整命令長度為16,但是串口讀的過程分幾次返回。

SerialPortHelper serialPortHelper = new SerialPortHelper(32);
SerialPortHelper serialPortHelper = new SerialPortHelper(32,true);

5.1.初始化串口

//方式一:快速接入方式,設置好串口地址,或者地址和波特率即可,數據位、停止位、校驗類型分別默認為8、1、N。
SerialPortHelper serialPortHelper = new SerialPortHelper(32);
//serialPortHelper.openDevice("dev/ttyS0");
serialPortHelper.openDevice("dev/ttyS0",11520);
// 數據接收回調
serialPortHelper.setSphResultCallback(new SphResultCallback() {
  @Override
  public void onSendData(SphCmdEntity sendCom) {
  Log.d(TAG, "發送命令:" + sendCom.commandsHex);
  }
 
  @Override
  public void onReceiveData(SphCmdEntity data) {
  Log.d(TAG, "收到命令:" + data.commandsHex);
  
  }
 
  @Override
  public void onComplete() {
  Log.d(TAG, "完成");
  }
 });
//方式二:通過SerialPortConfig設置相關串口參數
 
//串口參數
SerialPortConfig serialPortConfig = new SerialPortConfig();
serialPortConfig.mode = 0;  // 是否使用原始模式(Raw Mode)方式來通訊
serialPortConfig.path = path;  // 串口地址
serialPortConfig.baudRate = baudRate; // 波特率
serialPortConfig.dataBits = dataBits; // 數據位 取值 位 7或 8
serialPortConfig.parity = checkBits;// 檢驗類型 取值 N ,E, O
serialPortConfig.stopBits = stopBits; // 停止位 取值 1 或者 2
 
// 初始化串口
serialPortHelper = new SerialPortHelper(16);
// 設置串口參數
serialPortHelper.setConfigInfo(serialPortConfig);
// 開啟串口
isOpen = serialPortHelper.openDevice();
if(!isOpen){
 Toast.makeText(this,"串口打開失敗!",Toast.LENGTH_LONG).show();
}
// 數據接收回調
serialPortHelper.setSphResultCallback(new SphResultCallback() {
 @Override
 public void onSendData(SphCmdEntity sendCom) {
 Log.d(TAG, "發送命令:" + sendCom.commandsHex);
 }
 
 @Override
 public void onReceiveData(SphCmdEntity data) {
 Log.d(TAG, "收到命令:" + data.commandsHex);
 
 }
 
 @Override
 public void onComplete() {
 Log.d(TAG, "完成");
 }
});

5.2.數據發送與接收

// 發送數據
serialPortHelper.addCommands(sendHexTxt); // 發送十六進制字符串
serialPortHelper.addCommands(sendComBytes); // 發送字節數組
 
// 發送數據實體
SphCmdEntity comEntry = new SphCmdEntity();
comEntry.commands = commands; // 發送命令字節數組
comEntry.flag = flag;  // 備用標識
comEntry.commandsHex = DataConversion.encodeHexString(commands); // 發送十六進制字符串
comEntry.timeOut = 100; // 超時時間 ms
comEntry.reWriteCom = false; // 超時是否重發 默認false
comEntry.reWriteTimes = 5; // 重發次數 
comEntry.receiveCount = 1; // 接收數據條數,默認為1
serialPortHelper.addCommands(comEntry);
// 數據接收回調
serialPortHelper.setSphResultCallback(new SphResultCallback() {
 @Override
 public void onSendData(SphCmdEntity sendCom) {
 Log.d(TAG, "發送命令:" + sendCom.commandsHex);
 }
 
 @Override
 public void onReceiveData(SphCmdEntity data) {
 // 對於接受數據的SphCmdEntity,其中需要使用的有 
 // commandsHex 返回的十六進制數據
 // commands 返回的字節數組
 // flag 備用標識,例如標識該命令是相關操作
 Log.d(TAG, "收到命令:" + data.commandsHex);
 
 }
 
 @Override
 public void onComplete() {
 Log.d(TAG, "完成");
 }
});

5.3、關閉串口

serialPortHelper.closeDevice();

6、常見問題

6.1、串口打開失敗

一般情況就是設備節點的權限不正確,可以使用命令查看串口的設備節點權限。

7、修改記錄 20201225-修改

在原來的基礎上簡化瞭界面,把沒有需要用的東西給幹掉。

20201211-修改

基礎代碼和倉庫是原來作者的,但是原來的代碼經常掛掉,代碼上做瞭一些修改。後續會有更多的修改。

到此這篇關於Android串口通信apk源碼的文章就介紹到這瞭,更多相關Android串口通信apk源碼內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: