前一次我們講到了這篇[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 的原因,如果兩邊的速度不一樣,你甚麼也不會收到。
在這裡科普一下,根據維基百科的說法:單位「鮑」本身就已經是代表每秒的調制數,以「鮑每秒」(Baud per second)為單位是一種常見的錯誤,但是在一般中文口語化的溝通上還是常以「鮑率」來描述「鮑」(Baud)。
以 9600 baud 的速度來講,理論上每秒可以傳送 9600 個 bit,每個bit的時間就是 1/9600 = 104.16us
跟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://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這些介面搭配做使用,既然介紹了就一定會用到啊,敬請期待!
- STM32 Nucleo-64 boards (MB1136)資料手冊
https://www.st.com/resource/en/user_manual/dm00105823-stm32-nucleo-64-boards-mb1136-stmicroelectronics.pdf- STM32L053R8 datasheet
https://www.st.com/resource/en/datasheet/stm32l053r8.pdf- RM0367 Reference manual Ultra-low-power STM32L0x3 advanced Arm®-based 32-bit MCUs
https://www.st.com/resource/en/reference_manual/dm00095744-ultra-low-power-stm32l0x3-advanced-arm-based-32-bit-mcus-stmicroelectronics.pdf- ARM Mbed官網介紹 - NUCLEO-L053R8
https://os.mbed.com/platforms/ST-Nucleo-L053R8/- STM32 官網介紹 - STM32L053R8
https://www.st.com/en/microcontrollers-microprocessors/stm32l053r8.html#overview
- 此開發板售價在臺幣1000元以下,讀者可於以下網站購得:
https://www.mouser.tw/
https://www.digikey.tw/
此地無銀三百兩,你說呢
我這是老王賣瓜,自賣自誇不成?