Android串口通信apk源碼詳解(附完整源碼)
1、SerialPortHelper「Android串口通信」介紹
原項(xiàng)目地址
https://github.com/freyskill/SerialPortHelper
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è)置的原因是考慮在實(shí)際使用中,規(guī)定的串口通信協(xié)議格式一般會固定有最大長度,方便對數(shù)據(jù)進(jìn)行處理;
3、支持命令一發(fā)一收,通過對串口的讀寫線程進(jìn)行同步控制,命令會先加入到隊(duì)列然后依次發(fā)送和接收,前提需要設(shè)置超時(shí)時(shí)間以及超時(shí)處理,參考下面第4、5點(diǎn);
4、支持超時(shí)設(shè)置,設(shè)置超時(shí)時(shí)間后,如果命令在設(shè)置的時(shí)間內(nèi)未反饋,則會根據(jù)設(shè)置的操作進(jìn)行重發(fā)或退出該命令;
5、支持超時(shí)重發(fā)(可以N次重發(fā),具體按需設(shè)置)與退出,退出會調(diào)用接收回調(diào)的 onComplete 方法。
2、運(yùn)行apk演示
使用該庫簡單實(shí)現(xiàn)的串口調(diào)試助手工具,原來作者編譯的版本有點(diǎn)問題,點(diǎn)擊發(fā)送的時(shí)候會死掉,我重新修改了一份,大家在使用的時(shí)候如果有什么問題,可以提出來。
使用界面


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、使用說明
初始化需要設(shè)置maxSize,也可以設(shè)置isReceiveMaxSize該參數(shù)默認(rèn)為false,詳細(xì)說明如下:
int maxSize; // 設(shè)置串口讀取的最大數(shù)據(jù)長度
boolean isReceiveMaxSize; // 設(shè)置是否接收命令按最大長度進(jìn)行返回,比如串口協(xié)議定義的格式長度為16個(gè)字節(jié),這樣可以設(shè)置maxSize為16,然后設(shè)置該參數(shù)為true,則接收的命令就會返回16個(gè)字節(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,"串口打開失敗!",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; // 超時(shí)時(shí)間 ms comEntry.reWriteCom = false; // 超時(shí)是否重發(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();
6、常見問題
6.1、串口打開失敗
一般情況就是設(shè)備節(jié)點(diǎn)的權(quán)限不正確,可以使用命令查看串口的設(shè)備節(jié)點(diǎn)權(quán)限。
7、修改記錄 20201225-修改
在原來的基礎(chǔ)上簡化了界面,把沒有需要用的東西給干掉。
20201211-修改
基礎(chǔ)代碼和倉庫是原來作者的,但是原來的代碼經(jīng)常掛掉,代碼上做了一些修改。后續(xù)會有更多的修改。
到此這篇關(guān)于Android串口通信apk源碼的文章就介紹到這了,更多相關(guān)Android串口通信apk源碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Kotlin之自定義 Live Templates詳解(模板代碼)
這篇文章主要介紹了Kotlin之自定義 Live Templates詳解(模板代碼),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
Flutter自定義下拉刷新時(shí)的loading樣式的方法詳解
Flutter中的下拉刷新,我們通常RefreshIndicator,可以通過color或strokeWidth設(shè)置下拉刷新的顏色粗細(xì)等樣式,但如果要自定義自己的widget,RefreshIndicator并沒有暴露出對應(yīng)的屬性,那如何修改呢,文中給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01
Android使用GridView實(shí)現(xiàn)日歷的方法
本篇文章主要介紹了Android使用GridView實(shí)現(xiàn)日歷的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08
利用HorizontalScrollView實(shí)現(xiàn)滑動頁面時(shí)的縮放效果
這篇文章主要為大家詳細(xì)介紹了利用HorizontalScrollView實(shí)現(xiàn)滑動頁面時(shí)的縮放效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11
Android開發(fā)之OpenGL繪制2D圖形的方法分析
這篇文章主要介紹了Android開發(fā)之OpenGL繪制2D圖形的方法,結(jié)合實(shí)例形式分析了Android使用OpenGL ES的圖形繪制組件實(shí)現(xiàn)2D圖形繪制的原理、步驟及相關(guān)代碼注意事項(xiàng),需要的朋友可以參考下2017-09-09
Android仿京東淘寶自動無限循環(huán)輪播控件思路詳解
在App的開發(fā)中,很多的時(shí)候都需要實(shí)現(xiàn)類似京東淘寶一樣的自動無限輪播的廣告欄,這里小編寫了一個(gè),分享到腳本之家平臺供大家參考2017-04-04
用Android Studio3.0新功能加快構(gòu)建速度
本文主要介紹了使用Android Studio3.0新功能,加快Android Studio的構(gòu)建速度等相關(guān)做法。2017-11-11
android利用消息機(jī)制獲取網(wǎng)絡(luò)圖片
這篇文章主要為大家詳細(xì)介紹了android利用消息機(jī)制獲取網(wǎng)絡(luò)圖片的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
Android項(xiàng)目實(shí)現(xiàn)視頻播放器
這篇文章主要為大家詳細(xì)介紹了Android項(xiàng)目實(shí)現(xiàn)視頻播放器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03

