一、引言
近期,我參與了一個(gè)項(xiàng)目,需要將Windows機(jī)器與Android開(kāi)發(fā)版進(jìn)行UART串口通信。經(jīng)過(guò)幾天的查找和嘗試,我成功實(shí)現(xiàn)了這一功能。在此,我記錄下我的實(shí)現(xiàn)方案,希望為后來(lái)的同行提供一些參考,并分享我在GitHub上的開(kāi)源方案,請(qǐng)大家多多支持。二、項(xiàng)目背景與環(huán)境
該項(xiàng)目涉及以下環(huán)境配置: Android版本:3.0.1 Gradle版本:4.1 開(kāi)發(fā)板:ARM開(kāi)發(fā)版RK3399 PC機(jī)器:Win10 開(kāi)發(fā)機(jī)器:MAC 10.13.3三、UART串口通信的挑戰(zhàn)與解決方案

四、權(quán)限問(wèn)題與解決方案
在進(jìn)行UART串口通信時(shí),需要注意權(quán)限問(wèn)題。當(dāng)接入開(kāi)發(fā)板后,如果發(fā)生“Error You do not have read/write permission to the serial port”的權(quán)限錯(cuò)誤,需要開(kāi)啟root權(quán)限。在開(kāi)發(fā)者模式下,可以通過(guò)adb和應(yīng)用來(lái)開(kāi)啟root權(quán)限。 還要注意ttyS1-6對(duì)應(yīng)的是UART串口1-6的問(wèn)題。具體對(duì)應(yīng)關(guān)系需參照開(kāi)發(fā)板的說(shuō)明。五、關(guān)于Android Studio藍(lán)牙app的串口
Android Studio藍(lán)牙app的串口是一種通信方式,類(lèi)似于USB但比USB低級(jí)。手機(jī)等設(shè)備沒(méi)有外置串口,為解決此問(wèn)題,可以通過(guò)手機(jī)藍(lán)牙連接一個(gè)小硬件,該小硬件具備串口功能,與單片機(jī)連接,從而實(shí)現(xiàn)手機(jī)和單片機(jī)的串口通信。這種方式的本質(zhì)是藍(lán)牙串口。 藍(lán)牙串口基于SPP協(xié)議SerialPortProfile,能在藍(lán)牙設(shè)備間創(chuàng)建串口進(jìn)行數(shù)據(jù)傳輸。其特點(diǎn)是針對(duì)兩個(gè)不同設(shè)備通信的兩端應(yīng)用間保證一條完整的通信路徑。在使用時(shí),需要在系統(tǒng)設(shè)置里連接上HC05的藍(lán)牙,默認(rèn)配對(duì)密碼為1234,默認(rèn)波特率為9600。 由于我的項(xiàng)目是針對(duì)單一連接單片機(jī)的,同一時(shí)間只能接入一個(gè)藍(lán)牙設(shè)備,因此沒(méi)有更改連接藍(lán)牙模塊的需求。對(duì)于用戶(hù)而言,如果在創(chuàng)建項(xiàng)目時(shí)沒(méi)有更改設(shè)備MAC地址,則使用的是默認(rèn)的MAC地址。希望以上內(nèi)容能夠滿(mǎn)足您的要求。
關(guān)于Android藍(lán)牙串口開(kāi)發(fā)OutputStream發(fā)送數(shù)據(jù)失敗的問(wèn)題解析
一、數(shù)據(jù)正確性驗(yàn)證
在藍(lán)牙串口開(kāi)發(fā)中,首先要確保發(fā)送的數(shù)據(jù)是正確的。這是因?yàn)椋绻l(fā)送的數(shù)據(jù)不能被串口正確識(shí)別,接收端就無(wú)法返回你所期望的數(shù)據(jù)。若發(fā)送的命令本身不要求返回?cái)?shù)據(jù),那么在沒(méi)有數(shù)據(jù)返回的情況下,inputstream自然讀取不到任何內(nèi)容。
二、數(shù)據(jù)格式的重要性

數(shù)據(jù)的格式在藍(lán)牙串口通信中起著至關(guān)重要的作用。例如,當(dāng)你嘗試發(fā)送一段16進(jìn)制數(shù)據(jù)時(shí),如果直接將其定義為String類(lèi)型并通過(guò)out.write(str.getBytes())進(jìn)行發(fā)送,這種格式的數(shù)據(jù)往往無(wú)法正確傳輸。正確的做法應(yīng)該是定義一個(gè)byte型的數(shù)組,并將需要發(fā)送的數(shù)據(jù)按照正確的格式填充到這個(gè)數(shù)組中,然后發(fā)送這個(gè)數(shù)組。
三、循環(huán)讀取數(shù)據(jù)的技巧
當(dāng)進(jìn)行藍(lán)牙串口通信時(shí),采用循環(huán)讀取數(shù)據(jù)的方式可以更有效地獲取傳輸?shù)男畔?。但使用循環(huán)讀取時(shí),需要注意幾點(diǎn)。你需要確保已經(jīng)設(shè)置了讀取的超時(shí)時(shí)間,以避免程序因長(zhǎng)時(shí)間等待數(shù)據(jù)而阻塞。讀取數(shù)據(jù)時(shí),應(yīng)持續(xù)循環(huán)直到讀取到的內(nèi)容大于0為止。
四、其他可能的問(wèn)題及解決方案
除了上述提到的數(shù)據(jù)正確性和格式問(wèn)題,還有一些其他可能引發(fā)發(fā)送數(shù)據(jù)失敗的原因。例如,藍(lán)牙連接不穩(wěn)定、權(quán)限設(shè)置不當(dāng)?shù)?。針?duì)這些問(wèn)題,可以通過(guò)檢查藍(lán)牙連接的穩(wěn)定性、確保相關(guān)權(quán)限已正確設(shè)置等方式進(jìn)行解決。
五、總結(jié)與預(yù)防策略
在進(jìn)行Android藍(lán)牙串口開(kāi)發(fā)時(shí),遇到OutputStream發(fā)送數(shù)據(jù)失敗的問(wèn)題是很常見(jiàn)的。為了避免這類(lèi)問(wèn)題,開(kāi)發(fā)者應(yīng)始終確保發(fā)送的數(shù)據(jù)正確且格式合適,同時(shí)注意藍(lán)牙連接的穩(wěn)定性和權(quán)限設(shè)置。對(duì)于循環(huán)讀取數(shù)據(jù)的方式,要合理設(shè)置超時(shí)時(shí)間,以避免程序阻塞。只有充分理解并遵循這些基本準(zhǔn)則,才能更有效地進(jìn)行藍(lán)牙串口開(kāi)發(fā)。
以上是對(duì)于求教Android藍(lán)牙串口開(kāi)發(fā)OutputStream發(fā)送數(shù)據(jù)失敗問(wèn)題的深入解析和解決方案,希望能為開(kāi)發(fā)者在遇到類(lèi)似問(wèn)題時(shí)提供有益的參考和幫助。
