Android UART 串口通信實戰(zhàn)指南
一、背景介紹
近期,我接觸到一個項目,需要在Windows機器和Android開發(fā)版之間進行UART串口通信。經(jīng)過幾天的查找和嘗試,我最終找到了一個有效的解決方案。在此,我記錄下這個過程,希望為后來的開發(fā)者提供一些參考,并分享我的解決方案。以下是項目的背景信息:

Android版本:Android 3.0.1
開發(fā)工具:Gradle 4.1
開發(fā)板:ARM開發(fā)版 RK3399
PC機器:Win10
開發(fā)機器:MAC 10.13.3

二、遇到的挑戰(zhàn)與解決方案
在項目中,我遇到了一個主要的問題:由于使用的android-serialport-api項目中的so是基于較舊的ndk編譯的,所以在Android 6.0及以上版本存在兼容性問題。具體表現(xiàn)為“dlopen failed: has text relocations”的錯誤。為了解決這個問題,我決定升級項目,使用cmake進行編譯。
三、項目升級與結構
項目升級后,其結構如下:
`app`目錄對應原項目中的各個Activity。

`androidserial`是一個module,對應編譯之前的so,以及API的封裝。
你可以直接引用`androidserial`,并參照`app`目錄下的activity調(diào)用方法。
四、權限問題
在使用串口通信時,需要注意權限問題。如果接入開發(fā)板后出現(xiàn)“Error You do not have read/write permission to the serial port”的提示,那么你需要獲取root權限。在開發(fā)者模式中開啟root權限,或者使用adb命令為應用授權。使用以下命令開啟Android對串口的讀寫權限:`setenforce 0`(關閉防火墻)。
五、關于UART串口的細節(jié)

項目中涉及到的UART串口,如ttyS1-6,對應的是串口1-6。這些串口的對應關系需要參照開發(fā)板的說明。藍牙串口是基于SPP協(xié)議SerialPortProfile,能在藍牙設備之間創(chuàng)建串口進行數(shù)據(jù)傳輸。默認配對密碼為1234,默認波特率為9600。在項目設置里需要連接上對應的藍牙設備MAC地址。由于我的項目是單連接單片機,所以同一時間只能接入一個藍牙設備。我沒有在項目中設計選擇藍牙設備的模塊。
六、總結與展望
通過以上的步驟和注意事項,你應該可以順利實現(xiàn)Android和Windows機器之間的UART串口通信。希望這篇指南能為你提供一些幫助。如果你有任何問題或建議,歡迎留言,我會及時回復。我的項目代碼已經(jīng)開源,你可以通過git地址查看和下載。之后,我還會進一步完善這個項目,提供更多的功能和更好的用戶體驗。
七、附錄
Git地址(提供項目代碼的訪問鏈接)

相關命令和工具的使用說明(如adb命令等)
一、數(shù)據(jù)準確性驗證
在進行藍牙串口通信時,首要前提是確保發(fā)送的數(shù)據(jù)準確無誤。我們需要確保所發(fā)送的數(shù)據(jù)能被串口正確識別,并期望得到預期的響應。若發(fā)送的命令本身并不需要返回數(shù)據(jù),那么無需在inputstream中期待讀取回應。為確保數(shù)據(jù)準確性,我們需要對數(shù)據(jù)源進行細致校驗。
二、數(shù)據(jù)格式的正確性
在發(fā)送數(shù)據(jù)時,格式的正確性至關重要。例如,若需發(fā)送16進制數(shù)據(jù),錯誤的方式是將字符串如"01230545"直接轉換為字節(jié)流發(fā)送。正確做法應是定義一個字節(jié)型數(shù)組,將16進制數(shù)值正確轉換為字節(jié)后再進行發(fā)送。此過程需注意數(shù)據(jù)類型與編碼方式的匹配。
三、數(shù)據(jù)發(fā)送與接收的方式
在藍牙串口通信中,數(shù)據(jù)的發(fā)送與接收應采用恰當?shù)姆绞?。當使用OutputStream發(fā)送數(shù)據(jù)時,應確保藍牙連接已經(jīng)建立且保持穩(wěn)定。接收方需正確設置接收數(shù)據(jù)的超時時間,避免程序在等待數(shù)據(jù)過程中發(fā)生阻塞。
四、循環(huán)讀取數(shù)據(jù)的處理

在讀取數(shù)據(jù)時,采用循環(huán)讀取的方式是常見的處理方式。但需要注意的是,循環(huán)讀取的前提是已設置合理的超時時間。若未設置超時時間,程序可能因長時間等待數(shù)據(jù)而陷入教循環(huán)。在循環(huán)讀取數(shù)據(jù)時,務必確保超時設置的合理性。
五、問題排查與解決
在遇到藍牙串口開發(fā)OutputStream發(fā)送數(shù)據(jù)失敗的問題時,應根據(jù)上述幾個方面進行逐一排查。首先確認數(shù)據(jù)的準確性和格式正確性,然后檢查發(fā)送與接收方式是否恰當,最后檢查循環(huán)讀取數(shù)據(jù)的處理是否合理。若以上都確認無誤,仍出現(xiàn)問題,可考慮查看藍牙連接的穩(wěn)定性或?qū)で蟾鼘I(yè)的技術支持。
希望通過以上探討,能幫助開發(fā)者更好地解決在Android藍牙串口開發(fā)中遇到的OutputStream發(fā)送數(shù)據(jù)失敗的問題,確保藍牙通信的順暢進行。