UART 傳輸是在單晶片產品開發中相當基礎的通訊協定,可能很多朋友會問,UART 是甚麼? Arduino的控制板內有嗎? 這篇就來幫各位朋友快速的解釋一下這個通訊協定的內容與該怎麼使用它。
1. UART 傳輸基本原理
UART 的全名是 Universal Asynchronous Receiver/Transmitter,中文叫做通用非同步收發傳輸器,聽起來很玄( 😀 ),但其實就是一種訊息傳遞的方法,每個裝置會有兩個內部元件組成— TX 與 RX,TX 就是負責丟出訊息的元件,RX 就是負責接受訊息的元件,因為它在傳輸過程中,少了一條 CLOCK 訊號線來確認資料的時序,所以我們叫它非同步。也因為這樣的特性,所以訊息前面需要加入起始訊號跟最後面要加入停止訊號,這樣才可以確保訊息有被對方所以完整接收,完整的架構就像下圖所示。
各位朋友有注意到了嗎?其實 UART 這個通訊協定並不是只有存在於單晶片系統中,其實電腦平台也是支援的,所以也就為什麼我們可以透過 Uno 傳送訊息給電腦平台的原因了。
2. 電路接法
我們今天就來做個簡單的 UART 測試,要做的工作有兩項:
- 讓 UNO 丟出訊息到電腦平台,並可顯示到於電腦畫面。
- 電腦平台丟出訊息讓 UNO 確認,如訊息正確 LED 亮起 1 秒,後熄滅。
這邊說個需注意的地方,如果我們要讓傳遞的訊息於 Arduino 控制板顯示的話,UNO 必須要先外掛一個 LCD 螢幕,關於 LCD 顯示訊息的內容我們先留到其他篇講解,所以這邊我們先用內建的編號 13 LED 來表示接收到訊息的正確與否。
整體電路連接很簡單,就把 USB 傳輸線一端連接 UNO,一端連接電腦平台即可。
補充個知識,Tinkercad 除了可以模擬電路外,其實它還有提供一個簡單的串列通訊畫面,點兩下『程式碼』畫面的下方串列監視器,就可以看到實際我們的 UNO 板丟出訊息內容,當然也可以設定一些訊息丟入 UNO 內,非常方便,有需要的朋友可以試試看。
3. 程式功能
下面為完整的程式碼內容:
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(13,OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
Serial.println("Hello");
delay(1000);
if (Serial.available()>0){
int k= Serial.read();
if(k==74){ //J
digitalWrite(13,HIGH);
delay(1000);
digitalWrite(13,LOW);
}
}
}
+ 程式講解
- 第3行:begin (9600),這個函數主要為初始化 UART 的功能,我們這邊設定baud rate 為9600,這個值可以想像為設定傳輸的速度為何。
- 第4行:將編號13的腳位設定為輸出 OUTPUT,因為此腳位預設為連到 LED。
- 第9-10行:在主程式的迴圈中,放入 println() 這個輸出函數與延遲1秒的函數,Serial.println() 功能為透過 UART 傳遞訊息(記得加入雙引號),println 為輸出字串後加入換行的字元,當然如果你不想換行時,只需要使用Serial.print() 這個函數即可。
- 第11-17行:Serial.available() 這個函數判斷是否有 UART 的接收單元有收到訊息,如果有則為1,沒有則為0。一旦有接受到訊息時,利用Serial.read() 這個函數接收字元,並放入變數 i,如果接收字元為大寫的英文字母J時,LED 亮起 1 秒後熄滅。
4. 小結&懶人包
以上就是 Arduino UNO UART 通訊的接收與發送訊息的簡單測試,雖然 JIMI 哥這邊是做 Tinkercad 的模擬測試,如果做實際的 UNO 板 UART 通訊測試時,最直覺的方法是利用 Arduino 開發軟體 IDE內建的串列通訊視窗來確認,此功能放在『工具』=>『序列埠監控視窗』,記得先把 UNO 的 USB 連接到電腦,才可以開始使用。(不然訊息框會顯示 COM 通訊異常)
學會 UART 的基本技巧後,UART 最常見的實際應用是什麼?像 ESP8266 WIFI 模組就是透過UART的傳輸介面下指令溝通,建立起網路的溝通功能,另一個常用的功能就是拿來做 DEBUG 的技巧,當如果我們的 arduino 應用並不沒有 LCD 顯示時,如何確認我們的變數值或流程在執行過程中是否正確?也就可以利用UART的print 指令輸出關鍵的參數到電腦,或在重要的流程中插入 print 指令讓我們可以快速釐清程式的過程,所以 JIMI 哥才會在先前的文章內提到 UNO 的編號0與編號1盡可能可以預留不使用,即是為了如果有需要 DEBUG 時,作為一個輸出參數的管道,後續如果有相關的技巧,JIMI 哥會再與大家交流分享。
最後是今日懶人包內容,如果有什麼問題歡迎與我討論!
↓↓↓↓↓↓賣場連結↓↓↓↓↓↓
歡迎大家有需要的話,可以多多支持一下我們的蝦皮賣場喔! 😀
吉米家官方店-創客機器人材料專賣 https://shopee.tw/jimirobot.tw
Follow JIMI哥 Twitter : https://twitter.com/jimirobot <–得到最新文章通知