日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android串口通信apk源码

發(fā)布時間:2023/12/20 Android 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android串口通信apk源码 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

原項目地址

https://github.com/freyskill/SerialPortHelper

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

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

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

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

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

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

2、運行apk演示

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

使用界面

串口apk使用界面

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

3、Apk 下載地址

APK下載-SerialPortHelperV1.0.1-20201225.apk

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

如果github下載比較慢,可以關注公眾號「嵌入式Linux」,回復「serial」獲取下載鏈接。

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該參數(shù)默認為false,詳細說明如下:

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

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

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

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

5.1.初始化串口

//方式一:快速接入方式,設置好串口地址,或者地址和波特率即可,數(shù)據(jù)位、停止位、校驗類型分別默認為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()?{@Overridepublic?void?onSendData(SphCmdEntity?sendCom)?{Log.d(TAG,?"發(fā)送命令:"?+?sendCom.commandsHex);}@Overridepublic?void?onReceiveData(SphCmdEntity?data)?{Log.d(TAG,?"收到命令:"?+?data.commandsHex);}@Overridepublic?void?onComplete()?{Log.d(TAG,?"完成");}}); //方式二:通過SerialPortConfig設置相關串口參數(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;//?檢驗類型?取值?N?,E,?O serialPortConfig.stopBits?=?stopBits;?//?停止位?取值?1?或者?2//?初始化串口 serialPortHelper?=?new?SerialPortHelper(16); //?設置串口參數(shù) serialPortHelper.setConfigInfo(serialPortConfig); //?開啟串口 isOpen?=?serialPortHelper.openDevice(); if(!isOpen){Toast.makeText(this,"串口打開失敗!",Toast.LENGTH_LONG).show(); } //?數(shù)據(jù)接收回調(diào) serialPortHelper.setSphResultCallback(new?SphResultCallback()?{@Overridepublic?void?onSendData(SphCmdEntity?sendCom)?{Log.d(TAG,?"發(fā)送命令:"?+?sendCom.commandsHex);}@Overridepublic?void?onReceiveData(SphCmdEntity?data)?{Log.d(TAG,?"收到命令:"?+?data.commandsHex);}@Overridepublic?void?onComplete()?{Log.d(TAG,?"完成");} });

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

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

5.3、關閉串口

serialPortHelper.closeDevice();

6、常見問題

6.1、串口打開失敗

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

7、修改記錄

20201225-修改

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

20201211-修改

基礎代碼和倉庫是原來作者的,但是原來的代碼經(jīng)常掛掉,代碼上做了一些修改。后續(xù)會有更多的修改。

推薦閱讀:

專輯|Linux文章匯總

專輯|程序人生

專輯|C語言

我的知識小密圈

總結(jié)

以上是生活随笔為你收集整理的Android串口通信apk源码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。