iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 25
1
IoT

熟悉Arduino的Maker必看!30天帶你快速入門基於STM32嵌入式開發~系列 第 25

[Day 25]-【STM32系列】串列通訊的老祖宗:UART

前一次我們講到了這篇[Day 18]-【STM32系列】IC之間常用的通訊協定 I²C
今天要來聊聊另一個在通訊界面廣泛使用且歷史悠久
就是我們的串列通訊的老祖宗:UART

關於這個老祖宗

還記得上次我們說I²C是一個同步的Tx、Rx通訊協定,用兩條SCL(clock)、SDA(data)在不同設備中進行通訊
就是靠clock的邊緣觸發(即從HIGH到LOW或LOW到HIGH的觸發狀態),由data決定訊號為HIGH或LOW

而所謂同步指的就是指大家說好要在同一個時間傳送或接收資料,就像I²C那樣,Slave會在clock觸發邊緣狀態的時候讀取data的值,Master會確保clock在觸發期間資料的有效且穩定的

如果..大家也說好用一樣的速度呢?

沒錯,我們不再需要clock來告訴我們傳送資料了,兩邊都說好我們都用一樣的速度傳送資料,用一樣的速度接收資料,這樣不就好了嗎?

那這個說好用一樣的這個速度,在 UART 我們稱之為 鮑率(baud rate),也就是為甚麼你常常用Arduino的序列埠視窗前要先設定 9600 baud、115200 baud 的原因,如果兩邊的速度不一樣,你甚麼也不會收到。
https://sites.google.com/site/csjhmaker/_/rsrc/1485053179647/e-tong-xun-pian/serial-port-tong-xun/1-li-yong-xu-lie-bu-shi-chuang-xian-shi/1.png

在這裡科普一下,根據維基百科的說法:單位「鮑」本身就已經是代表每秒的調制數,以「鮑每秒」(Baud per second)為單位是一種常見的錯誤,但是在一般中文口語化的溝通上還是常以「鮑率」來描述「鮑」(Baud)。

如何傳送?

以 9600 baud 的速度來講,理論上每秒可以傳送 9600 個 bit,每個bit的時間就是 1/9600 = 104.16us
https://ithelp.ithome.com.tw/upload/images/20201010/201200930OPb6rOcMV.png

跟I²C很像的一點就是,當UART開始傳送時,會先發送1 bit 的start condition的信號,平時這個UART保持在高電位,當要開始傳送時就讓UART維持低電位,這樣接收端就知道說有資料要傳送過來了,那就以start conditiond往後數104.16us,就是第一個 data bit 的開始

接著每個bit間隔104.16us讀出共8位元的資料,最後一個位元為同位位元(parity bit),同位位元分為偶同位位元(even parity)和奇同位位元(odd parity)

以偶同位位元(even parity)來說,如果一組資料'1'的個數是奇數,偶同位位元就會補一個bit為1,使一組資料的'1'的個數是偶數。假如傳送的資料為1110101共7個bit,其中有5個1,偶同位位元就會補一個1,使整組資料為11101011共8個bit,其中有6個1。奇同位位元(odd parity)只差在使一組資料的'1'的個數是奇數,其他的規則一樣

https://ithelp.ithome.com.tw/upload/images/20201010/20120093cFTF1aC2Wb.png
圖片來源:https://www.solitontech.com/uart-protocol-validation-service/

如果接收端收到的資料發現有誤,其中一個bit變成0或1了,假如是偶同位位元,收到的資料卻是奇數個'1',那我們就知道資料在傳送的時候出錯了,重傳。但聽到這裡你可能會想,好在今天是只有1個錯誤,如果是兩個bit傳錯怎麼辦?這就是這個演算法最大的問題,只能針對單個bit偵錯。不過好家在,現今隨著硬體的提升軟體的支援越發強大,UART 已經很少在用 parity bit。大多數變成1bit start + 8bit data

還沒完,再加上一個stop bit為HIGH,所以前前後後每8bit還要再加上2個bit,因此實際上傳送的效率可能不及9600 baud。至於stop bit做甚麼用的?其實就只是分隔前後8bit的資料罷了,算是一個安全的時間間隔。

說了這麼多,其實UART也不過是一個通訊協定,實務上常見會需要搭配RSR-232、RS-422、RS-485這些介面搭配做使用,既然介紹了就一定會用到啊,敬請期待!


相關連結


結語

此地無銀三百兩,你說呢
我這是老王賣瓜,自賣自誇不成?


上一篇
[Day 24]-【STM32系列】多級串聯點矩陣 x MAX7219
下一篇
[Day 26]-【STM32系列】UART/USART TX 資料傳送篇(上)
系列文
熟悉Arduino的Maker必看!30天帶你快速入門基於STM32嵌入式開發~30

尚未有邦友留言

立即登入留言