首頁 > 評測 > Android Things之七:樹莓派3實現(xiàn)串口通信
Android Things之七:樹莓派3實現(xiàn)串口通信
- [導讀]
- 關(guān)于Android Things的探索,并不會因為買不起i.MX 7D的顯示屏配件而止步!接下來只能換上樹莓派3B來繼續(xù)學習了。
從今天開始,準備使用RPI3來代替i.MX7D做Android Things開發(fā)。
歡迎加入Android Things交流群:452863046
因為接下來準備探索GUI編程。不錯,Android Things是支持GUI的,不過專用的顯示屏太貴,而RPI3也是支持Android Things并且提供了HDMI接口,不必另外專門購買一個專用的顯示屏了。
UART是用于與外圍設備交換原始數(shù)據(jù)的通用接口。它是通用的,因為數(shù)據(jù)傳輸速度和數(shù)據(jù)字節(jié)格式都是可配置的。同時它是異步的(UART而非USART),因為沒有時鐘信號來同步兩個設備之間的數(shù)據(jù)傳輸。設備硬件會在先進先出(FIFO)緩沖區(qū)中收集所有傳入數(shù)據(jù),直到應用程序讀取完成為止。
UART數(shù)據(jù)傳輸是全雙工的,這意味著可以同時發(fā)送和接收數(shù)據(jù)。它通常比I 2 C 快,但缺少共享時鐘意味著兩個設備必須就每個設備能夠以最小的定時誤差獨立地遵守的通用數(shù)據(jù)傳輸速率達成一致。
UART外設通常有兩種形式:
• 3線端口包括數(shù)據(jù)接收(RX),數(shù)據(jù)發(fā)送(TX)和接地參考(GND)信號。
• 5線端口添加用于硬件流控制的發(fā)送請求(RTS)和清除發(fā)送(CTS)信號。流控制允許接收設備指示其FIFO緩沖器暫時滿,并且發(fā)送設備應該在發(fā)送任何更多數(shù)據(jù)之前等待。
與SPI和I2C不同,UART僅支持兩個器件之間的點對點通信。
一般為了簡單,通常只使用UART來通信,這樣只需要三根線就可以通信,如圖。為了和RPI3進行UART通信,另外使用了一塊Arduino UNO,通過Arduino的UART與RPI進行通信。
RPI3的GPIO引腳接口如下
連接后的硬件如下
接下來開始寫代碼。
Arduino端的代碼非常簡單,如下
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("Uart Initialized. Now commucation begins...");
}
void loop() {
// put your main code here, to run repeatedly:
if(Serial.available()) {
String msg = Serial.readString();
Serial.println(msg);
}
}
代碼的作用就是打開串口,設置通信速率,其它的參數(shù)使用默認值。一旦串口接收到數(shù)據(jù),就打印出來,驗證通信是否成功。
接下來是Android Things端的代碼了。相比GPIO/I2C等設備通信來說,UART的通信稍微復雜一些,主要是增加了事件監(jiān)聽機制。這樣的好處是減少輪詢時大量CPU時間的浪費。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
mUartDevice = PeripheralManager.getInstance().openUartDevice(UartName);
configureUart(mUartDevice);
mHandler.post(new Runnable() {
@Override
public void run() {
try {
mUartDevice.write(msg.getBytes(), msg.getBytes().length);
} catch (IOException e) {
e.printStackTrace();
}
Log.d(TAG, "run: " + msg);
mHandler.postDelayed(this, 2000);
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
在onCreate函數(shù)里,主要做了兩件事:一是打開UART設備;其次是使用Handler來定時發(fā)送消息。
打開UART設備與前面使用GPIO的方法并無差別,先使用PeripheralManager來獲取一個實例,然后通過該實例來管理UART設備,這些方法都放在try...catch塊中以處理異常。
Handler來實現(xiàn)定時操作是Android中常見的操作,參考前文相關(guān)介紹,這里每隔2秒發(fā)送一段信息。
@Override
protected void onStart() {
super.onStart();
try {
mUartDevice.registerUartDeviceCallback(mUartDeviceCallback);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
protected void onStop() {
super.onStop();
mUartDevice.unregisterUartDeviceCallback(mUartDeviceCallback);
}
這一段代碼用來注冊及注銷UART事件回調(diào),即只有在APP處于前臺時才監(jiān)聽事件。
private UartDeviceCallback mUartDeviceCallback = new UartDeviceCallback() {
@Override
public boolean onUartDeviceDataAvailable(UartDevice uartDevice) {
return false;
}
};
這里是UART事件處理程序,當串口接收到數(shù)據(jù)后,可以在這里處理,這里只演示了RPI3發(fā)送數(shù)據(jù)的情況,沒有處理接收后的數(shù)據(jù)。當然我們可以在這里加一條簡單的LOG語句來處理接收到的信息。
public void configureUart(UartDevice uart) throws IOException {
uart.setBaudrate(115200);
uart.setDataSize(8);
uart.setParity(UartDevice.PARITY_NONE);
uart.setStopBits(1);
}
這里配置UART參數(shù),注意與Arduino端的配置要相同,否則接收到的數(shù)據(jù)就是亂碼了。
將代碼上傳到RPI3,通過Android Studio及Arduino各自的監(jiān)聽機制,可以看到實時的通信情況,如下圖
這是Arduino端的串口監(jiān)視器查看到的結(jié)果,注意通信率為115200。
這是Android Studio的Logcat輸出的信息,使用了filter來過濾其它的信息,只顯示與串口通信相關(guān)的輸出。
接下來準備開始GUI的編程體驗,通過RPI3的HDMI接口連接顯示器,可以實現(xiàn)圖形化的操作外設
這是Android Things的桌面(如果也能稱為桌面的話),這里可以看到一些硬件相關(guān)的信息,如IP地址,GPIO等外設,要查看更具體的外設信息,可以點擊I/O Pinout,得到如下信息
接下來我們開始激動的GUI之旅吧!
- 本文系21ic原創(chuàng),未經(jīng)許可禁止轉(zhuǎn)載!
網(wǎng)友評論
- 聯(lián)系人:巧克力娃娃
- 郵箱:board@21ic.com
- 我要投稿
-
歡迎入駐,開放投稿
-
人均百萬?英偉達中國員工收入曝光! 2024-08-29
-
《黑神話:悟空》玩家硬盤升級攻略:提升游戲體驗,暢享3A大作 2024-08-29
-
數(shù)睿數(shù)據(jù)參加《系統(tǒng)與軟件工程 低代碼開發(fā)平臺通用技術(shù)要求》國家標準編制 2024-08-29
- NRF52810藍牙數(shù)字耳機找人定制
預算:¥30005天前
- 125KW模塊式PCS軟硬件外包開發(fā)
預算:¥1100000015小時前
- 12V汽車啟動電源項目BMS設計
預算:¥50000023小時前
- 數(shù)據(jù)可視化軟件 開發(fā)
預算:¥5000023小時前
- PLC項目調(diào)試修改
預算:¥100001天前
- 起動電機控制器開發(fā)
預算:¥1100001天前