您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關怎么在Android中實現串口通信,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
Android串口通訊助手可以用于需要使用串口通信的Android外設,該庫有如下特點:
1、串口通信部分使用C++實現,在筆者接觸的部分設備上實測,使用C++實現與Google官方提供的Demo的方式要快;
2、支持且必須設置串口接收最大數據長度,初始化庫時填入該參數,這樣設置的原因是考慮在實際使用中,規定的串口通信協議格式一般會固定有最大長度,方便對數據進行處理;
3、支持命令一發一收,通過對串口的讀寫線程進行同步控制,命令會先加入到隊列然后依次發送和接收,前提需要設置超時時間以及超時處理,參考下面第4、5點;
4、支持超時設置,設置超時時間后,如果命令在設置的時間內未反饋,則會根據設置的操作進行重發或退出該命令;
5、支持超時重發(可以N次重發,具體按需設置)與退出,退出會調用接收回調的 onComplete 方法。
使用該庫簡單實現的串口調試助手工具,原來作者編譯的版本有點問題,點擊發送的時候會死掉,我重新修改了一份,大家在使用的時候如果有什么問題,可以提出來。
使用界面
串口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
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' }
初始化需要設置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();
上述就是小編為大家分享的怎么在Android中實現串口通信了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。