怎么在Android中實(shí)現(xiàn)串口通信-創(chuàng)新互聯(lián)

這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)怎么在Android中實(shí)現(xiàn)串口通信,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

成都創(chuàng)新互聯(lián)公司專業(yè)提供資陽托管服務(wù)器服務(wù),為用戶提供五星數(shù)據(jù)中心、電信、雙線接入解決方案,用戶可自行在線購買資陽托管服務(wù)器服務(wù),并享受7*24小時金牌售后服務(wù)。

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

Android串口通訊助手可以用于需要使用串口通信的Android外設(shè),該庫有如下特點(diǎn):


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

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

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

4、支持超時設(shè)置,設(shè)置超時時間后,如果命令在設(shè)置的時間內(nèi)未反饋,則會根據(jù)設(shè)置的操作進(jìn)行重發(fā)或退出該命令;

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

2、運(yùn)行apk演示

使用該庫簡單實(shí)現(xiàn)的串口調(diào)試助手工具,原來作者編譯的版本有點(diǎn)問題,點(diǎn)擊發(fā)送的時候會死掉,我重新修改了一份,大家在使用的時候如果有什么問題,可以提出來。

使用界面

怎么在Android中實(shí)現(xiàn)串口通信

串口apk使用界面

怎么在Android中實(shí)現(xiàn)串口通信

數(shù)據(jù)收發(fā)界面

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 rootbuild.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、使用說明

初始化需要設(shè)置maxSize,也可以設(shè)置isReceiveMaxSize該參數(shù)默認(rèn)為false,詳細(xì)說明如下:

int maxSize;  // 設(shè)置串口讀取的較大數(shù)據(jù)長度

boolean isReceiveMaxSize; // 設(shè)置是否接收命令按較大長度進(jìn)行返回,比如串口協(xié)議定義的格式長度為16個字節(jié),這樣可以設(shè)置maxSize為16,然后設(shè)置該參數(shù)為true,則接收的命令就會返回16個字節(jié)的長度。

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

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

5.1.初始化串口

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

5.2.數(shù)據(jù)發(fā)送與接收

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

5.3、關(guān)閉串口

serialPortHelper.closeDevice();

上述就是小編為大家分享的怎么在Android中實(shí)現(xiàn)串口通信了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

標(biāo)題名稱:怎么在Android中實(shí)現(xiàn)串口通信-創(chuàng)新互聯(lián)
分享網(wǎng)址:http://bm7419.com/article8/gejip.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊App設(shè)計(jì)、關(guān)鍵詞優(yōu)化網(wǎng)站設(shè)計(jì)、微信小程序、商城網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)