UART (Universal Asynchronous Receiver/Transmitter)

UART 是一種異步收發傳輸器,是電腦硬體的一部分,將數據透過串列通訊和平行通訊間作傳輸轉換,沒有額外的 clock 資料,所以取樣頻率只能相近,不會相等,即非同步。
UART 通常用在與其他通訊接口 (如 EIA RS-232) 的連接上。

最精簡的情況下,具有收、送訊息的 UART,只需要使用兩根訊號線,如下:
TX (Transmitter): 輸出訊號。
RX (Receiver): 接收訊號。


下圖為 UART 線路範例,由兩個 UART 裝置組成:

UART 簡介
裝置的 RX 要與另一個裝置的 TX 互接。

由於不使用時脈訊號來同步發送器和接收器裝置,所以兩個 UART 裝置是約定好使用相同的頻率,所以為 異步串行通信 或 非同步串行通信(Asynchronous serial communication),在 UART 使用的頻率稱為鮑率(BAUD rate),可能為 9600、19200、 38400、115200、… Hz。

發送器根據其時脈訊號產生的位元流取代了時脈訊號,接收器使用其內部時脈訊號對輸入資料進行採樣。同步點是透過兩個裝置的相同串列傳輸速率來管理的。如果串列傳輸速率不同,發送和接收資料的時序可能會受影響,導致資料處理過程出現不一致。允許的串列傳輸速率差異最大值為10%,超過此值,位元的時序就會脫節。

當不傳輸資料時,UART TX 通常保持高電壓位準。
若要開始資料傳輸,UART TX 會將傳輸線從高位準拉到低位準並保持 1 個時脈週期,當 UART RX 檢測到高到低電壓躍遷時,便開始以串列傳輸速率對應的頻率讀取資料幀中的位元。
UART 傳輸資料時主要包含了起始位元、資料、parity bit 及停止位元,其中的資料從 LSB 先傳送。

「9600,8,N,1」這種設定,意思就是 9600 bps 的 baud rate、8 個資料位元,N 則代表沒有 parity bit,1 則是 1 個停止位元的意思。
UART 每一份資料的傳送都會重新靠 start bit 來同步字元的開始位置,因此 baud rate 的誤差不會累積。

在 UART 上傳輸 8 個 bit,還要加上一前一後的起始位元停止位元,總共 2 個額外的位元。
因此 115200 bps 的 UART 上能傳送的頻寬是 115200/10 = 11520 byte/sec。

 

UART 的線路圖範例為:

Circuit Design For Multiple UART Connections | Hackaday

 

 

實作注意事項

電壓等級:UART 訊號可支援 1.8 V 或 3.3 V 或 5 V。在連接之前,務必確認所需電壓等級,以避免硬體損壞。

RX 端多重連接:在簡單的廣播應用中,多個 RX 端連接是允許的。
                            要注意的是,每個 RX 輸入會對 TX 驅動端增加額外負載,包括輸入電容及少量電流消耗。

TX 端多重連接:多個 TX 端直接連接同一訊號線為不安全的操作。
                            例如:若 TX1 將訊號線拉高至 Vcc,同時 TX2 將訊號線拉低至 0 V,則可能形成 Vcc 與 GND 直接短路,造成硬體損壞。

 

 

如何對 UART Port 傳送、接收訊號

在 Linux 中,UART Driver 會針對每個 UART Port 生成各自的 device node。
針對這些 device node 進行讀、寫的操作,即可對 UART Port 進行接收、傳送訊息。
讀的操作可以用 cat 指令,寫的操作可以用 echo 或 printf 指令。
執行 minicom / microcom 則可同時進行讀寫。

UART Port 可能長出的 device node 如下:
/dev/ttyS* → onboard serial ports
/dev/ttyUSB* → USB-to-UART adapters
/dev/ttyAMA* or SoC-specific → embedded UARTs
/dev/ttyPS* → Xilinx Zynq or Zynq UltraScale + MPSoC platforms

透過 stty 指令,可以查看或修改 UART Driver 的設定。
查看 /dev/ttyS0 的設定:
# stty -F /dev/ttyS0

# stty -F /dev/ttyS0 -a

修改 /dev/ttyS0 的設定,設定 baud rate 為 115200,並關閉 hardware flow control (RTS/CTS):
stty -F /dev/ttyS0 115200 -crtscts 

很重要的一點是,接收端跟傳送端的參數值要設定為一致,否則會無法正確傳送及接收訊息。

兩端參數值都設定完成後,可以透過 echo / printf 及 cat 指令直接從 device node 來傳送及接收訊息。
傳送 "abc" 到 /dev/ttyS0:
# echo "abc" > /dev/ttyS0
# printf "abc\n" > /dev/ttyS0

從 /dev/ttyS0 接收訊息:
# cat /dev/ttyS0

確認設定值沒問題後,則可以直接執行 minicom / microcom 程式來針對該 device node 傳送及接收訊息。
minicom -b 115200 -D /dev/ttyS0
microcom -s 115200 -p /dev/ttyS0

在使用 minicom / microcom 第一個最常遇到的問題時,在輸入資料時,看不到輸入的值,而誤以為功能不正常。
此時,只要確認接收端,看是否有收到資料,如果有收到,則表示功能正常。

 

Echo

在使用 minicom / microcom 時,看不到輸入的值跟 Echo 的機制有關,Echo 分為兩種模式:
local Echo:直接在發送端顯示輸入的資料,不管接收端是否有收到。
remote Echo:接收端在收到資料之後,會再把資料傳給發送端,此時發送端可以看到自己所輸入的資料。

local Echo 的功能,只有 minicom 有支援,執行 minicom 後,按下 "CTRL-A Z" 後,從選單中,可以看到設定 local Echo 的項目:
"local Echo on/off..E"
再按下 E 鍵,即可開啟或關閉 local Echo。

而 remote Echo 的功能,則不管是 minicom 或 microcom ,都沒有支援。

如果在發送端開啟了 local Echo 的功能,而接受端也有支援 remote Echo 功能的話,則在發送端會看到兩份的輸入資料。
例如:"aabbccdd"。

 

 

 

Reference

UART、RS232、TTL关系浅析 RS232 vs TTL: Beginner Guide to Serial Communication Wiki: Serial port

UART:瞭解通用非同步接收器/發送器的硬體通訊協定

UART 硬體流量控制 CTS及RTS

 

全站熱搜
創作者介紹
創作者 silverwind1982 的頭像
silverwind1982

拾人牙慧

silverwind1982 發表在 痞客邦 留言(0) 人氣()