UART 是一種常見的有線通訊方式,幾乎所有的電腦相關設備都支援這個通訊方式,他透過最少三條訊號線:發射、接收、地線,來進行設備之間的資料交換與通訊。或許你對 UART 這名稱較不熟悉,他還有另一個名稱:RS232 串列通訊。
開始之前
事前準備
這次要準備的東西不多。
- mbed LPC1768
- 電腦或筆電
- USB 轉 TTL 傳輸線
其中以** USB 轉 TTL 傳輸線**最為重要,透過這條線可以直接讓電腦與 mbed 做通訊。這條線你可以在網路上找到,價格非常便宜,你也可以自行 DIY 一個,用的核心 IC 大多為 PL2303 系列。
除此之外,你還需要一個軟體來監聽 mbed 透過 UART 傳至電腦的軟體。
CoolTerm 好用的串列埠監聽軟體
本來我是想介紹用 Terminal 的方式,不過想想覺得太複雜,還好有人佛心寫了好用又免費的軟體可以用,那就是 CoolTerm。這軟體我實際用起來感覺非常方便,簡單的點點按按就可以連接上要監聽的串列埠了。
使用介面可以參考下圖
Options 是設定連接埠的重要選項,點進去後長這樣
到這邊就是基本的 Coolterm 介紹。
Windows 事前準備
Windows 與 MAC 或 Linux 不大相同,前者需要安裝驅動程式,後者則不用。
若你是 Windows 使用者,請先這樣做:
- 點此下載驅動程式
- 將 mbed 接上電腦
- 安裝驅動程式
安裝過程中如果看到以下視窗請點 Install
之後等待安裝程式跳出 The driver was installed successfully 後點下 Finish 即安裝完成。
然後在我的電腦上按右鍵選擇管理,在左側選單找到裝置管理員看看有沒有多出一個名叫 mbed Serial Port 的裝置,有的話請記下括號中的名稱,我的是 COM13。
直接使用 USB
mbed LPC1768 有提供一個內建的 USB 串列通訊方式,當你將 mbed LPC1768 與你的電腦連上時,他就會建立一個虛擬的 COM port 可供使用,也就是說,你可以直接使用這個內建的功能做 Debug 。Windows 使用者請記得安裝驅動程式!
Hello World
慣例慣例。
1 2 3 4 5 6 7 8 9 |
#include "mbed.h" Serial pc(USBTX, USBRX); // tx, rx 發射, 接收 int main() { pc.printf("Hello World!\n\r"); } |
執行結果
回應鍵盤輸入
這個會在你按下鍵盤的按鍵時回傳一個你所輸入的字元的下一個字元,例如你輸入 A ,你畫面就會跳出 B 。
程式碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#include "mbed.h" Serial pc(USBTX, USBRX); // tx, rx 發射, 接收 int main() { // 傳送 Hello World! 字串到電腦 pc.printf("Hello World!\n"); while(1) { // 回傳鍵盤按下的按鍵並 + 1(A->B, B->C) pc.putc(pc.getc() + 1); } } |
一般 UART 通訊
了解與電腦之間的溝通之後,我們要來試試看從 mbed 的其他腳位送出 UART 訊號。
mbed LPC1768 除了 USB 通訊用的一組 UART 之外,還有另外三組可供使用。
組 | Tx | Rx |
---|---|---|
1 | p9 | p10 |
2 | p13 | p14 |
3 | p28 | p27 |
上表就是這三組的腳位位置,而程式碼的部分其實也很簡單,只需要改建立物件時所宣告的腳位位置就可以了。
硬體接線
找不到圖好畫,不過接線很簡單,只要記得 Rx 對應 Tx,Tx 對應 Rx 就可以了。
要理解這樣接線的原因,首先要知道 Rx 與 Tx 代表的意思。
Rx = Receiver 也就是接收者(端)的意思
Tx = Transmitter 也就是發射者(端)的意思
知道意思後,就可以很明白的理解,為何 Rx 要對應到 Tx 然後 Tx 要對應到 Rx 了。
接下來我們來看看程式。
Hello World
同樣也是慣例,這邊要注意的是,Tx 與 Rx 的位置有做過更動。
1 2 3 4 5 6 7 8 9 |
#include "mbed.h" Serial mySerial(p9, p10); // tx, rx 發射, 接收 int main() { mySerial.printf("Hello World!\n\r"); } |
回應鍵盤輸入
跟使用 USB 與 PC 溝通時的效果相同。
程式碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#include "mbed.h" Serial mySerial(p9, p10); // tx, rx 發射, 接收 int main() { // 傳送 Hello World! 字串到電腦 mySerial.printf("Hello World!\n"); while(1) { // 回傳鍵盤按下的按鍵並 + 1(A->B, B->C) mySerial.putc(pc.getc() + 1); } } |
多開 UART
這幾組 UART 有個很有趣的特色,就是可以同時開啟!
開法很簡單,只要個別宣告物件就可以了。
程式碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include "mbed.h" Serial pc(USBTX, USBRX); // tx, rx 發射, 接收 Serial mySerial1(p9, p10); Serial mySerial2(p13, p14); Serial mySerial3(p28, p27); int main() { // 傳送 Hello World! 字串到電腦 pc.printf("Hello World!\n"); mySerial1.printf("Hello World! from 1\n"); mySerial2.printf("Hello World! from 2\n"); mySerial3.printf("Hello World! from 3\n"); } |
P.S. 我沒測試這個,我只測試過同時兩個的,理論可行。
總結
mbed LPC1768 加上 USB 端的話總共提供了四組 UART 可以使用,可以說是非常之多。而這帶給 mbed LPC1768 一個不錯的優勢,就是當需要與多個採用 RS232 傳輸協定的外部裝置溝通時,他的處理能力會快很多。
這篇有點晚發,實在是不好意思。
不好意思我想問一下如果我今天接一個感測器
我設Serial device(D1,D0)//我的板子是F411RE
然後感測器的TX插在板子RX(D0)
可是都讀不到東西@@
記得共地
有..我有接地..