# Arduino講義:Keypad密碼鎖(Preview) ## Intoduction of UART * **UART** 全文為 **Universal Asynchronous Receiver/Transmitter** ,即**通用非同步收發傳輸器**。 * 通用非同步收發傳輸器是一種[異步收發傳輸器](https://en.wikipedia.org/wiki/Asynchronous_serial_communication) * 將資料由串列傳輸 (Serial communication) 與平行傳輸 (Parallel communication) 間作傳輸轉換。 ![](http://wiki.csie.ncku.edu.tw/embedded/USART_DataTransmission.gif) * **單工、半雙工與全雙工** | 單工 | 半雙工 | 全雙工 | | -------- | -------- | -------- | |![](https://i.imgur.com/NkVAamw.jpg)|![](https://i.imgur.com/rICbdJp.jpg) |![](https://i.imgur.com/RBbG5hN.jpg)| |只支持信號在一個方向上傳輸(正向或反向),任何時候不能改變訊號的方向。 EX:計算機和印表機之間的通信、B.B.Call。 | 允許信號在兩個方向上傳輸,但同一時間只允許信號在一個信道上單向傳輸。EX:傳統的對講機。 |允許數據同時在兩個方向上傳輸,即有兩個信道,因此允許同時進行雙向傳輸。 EX:電話、手機、RS232。 | * 原文網址:https://kknews.cc/zh-tw/other/y2av3rj.html * **串列 v.s 並列** * 串列 ![](https://i.imgur.com/iR4wqGW.jpg) * 一次傳送一個 bit,傳輸速率較慢、成本較低、可遠距離傳輸。 * EX :滑鼠、鍵盤、電腦網路傳輸、RS-232 介面。 * 並列 ![](https://i.imgur.com/WqHNHVN.jpg) * 一次傳送多個 bit,傳輸速率快、成本高、僅限短距離使用。 * EX :25Pin D-Type印表機。 * 注意:並列傳輸的線路較多,但傳輸速度不一定比較快(因為接收端要同時將傳進來的資料整合及排列,虛耗額外的位元及處理時間) * **非同步 (Asynchronous) v.s 同步 (Synchronous)** * 非同步 ![](https://i.imgur.com/gvCSISx.jpg) * 雙方有各自的時脈, 在傳送資料時插入額外資訊,表示資料起始、結束。優點是設定時間短、硬體成本低、機器時脈不同也能傳資料,缺點是單次傳輸的資料量較少。 * EX : RS-232 (實現方式簡單低廉)、 RS-422 (較長距離的傳輸)、RS-485 (較多的裝置連接數目)。 * 同步 ![](https://i.imgur.com/cDlmMqx.jpg) * 雙方共用時脈(一次只做一件事),額外提供時脈訊號,使兩端機器在溝通時能夠藉此同步收發資料。比起非同步傳輸,同步傳輸不需要 start/stop bit ,因此能夠一次傳較多的資料。 * EX : I2C 、 SPI 。 * **UART** * 全雙工 * 串列 * 非同步 * 由2個獨立的接收 (RX) 、發送 (TX) 緩衝器構成,可同時發送和接收資料。 * 若 baud 為 9600 (bits/sec),表示每秒可以傳 960 Bytes 的資料量。 * UART 傳送1 Byte (=8 bits)資料,加上頭尾共為10 bits。 $$\frac{9600(bits)}{startbit(1 bits)+data(8 bits)+stop bit(1 bits)}= 960Bytes$$ [參考資料](https://zh.wikipedia.org/wiki/%E6%B3%A2%E7%89%B9%E7%8E%87) ## UART Protocol ![](https://i.imgur.com/EFrYOMa.png) * 每個符號由三種資料共10個位元所組成,共分為: 1. 起始位元 (Start Bit) 2. 資料內容 (Data) 3. 停止位元 (Stop Bit) * 每個資料在傳送前都會有一個低電位的起始位 (start bit) ;資料傳完之後會接著一組停止位元 (stop bit)。 * 因此,若假設資料長度為 8bits,加上頭尾,每傳 1byte 至少需要 10bits。 :::info 在起始位 (start bit) 期間,資料發送端 (TX) 處於低電位;在停止位 (stop bit) 期間,資料發送端 (TX) 處於高電位。 ::: * [UART歷史](http://makerpro.cc/2016/04/understand-what-is-uart/) * USART_BaudRate: * **Baud** 指的是有效數據信號調製載波的速率,**1鮑即指每秒傳輸1個符號**,而通過不同的調製方式,可以在一個碼元符號上負載多個bit位信息。 * Asynchronous Normal Mode: $$Baud = \frac{f_{osc}}{16\times (UBRRn+1) }$$ $$UBRR = \frac{f_{OSC}}{16\times baud } – 1$$ * **Baud(bits/sec)** : Baud rate * **f~OSC~** : System oscillator clock frequency * **UBRRn** : Contents of the UBRRnH and UBRRnL Registers(用來設定 Baud Rate )。![](https://i.imgur.com/Xgarr18.jpg) --- ## UART register description * **Receive buffer** : 只能讀出不能寫入。 * **Transmitter buffer** :只能寫入不能讀出。 * **Interrupt Enable Register** : CPU寫入暫存器告訴UART何時中斷。 ### UCSR0A(USART Control and Status Register 0 A) ![](https://i.imgur.com/DSOuooD.png) * 它是一個暫存器,用於指示串行通信的控制和狀態。 * **RXC0** ( USART Receive Complete ) : 當**接收緩衝區**中存在未讀取的數據時,旗標設為1。用來知道何時能收到一個位元組。 * **TXC0**( USART Transmit Complete ) : 當**發送緩衝區**中發送數據時,**TXC0**( USART 發送完成 )變為1。 * **UDRE0** ( USART Data Register Empty ) : 當數據可寫入**傳輸緩衝區**時,**UDRE0**(USART數據暫存器為空)變為1。 ### UCSR0B(USART Control and Status Register 0 B) ![](https://i.imgur.com/H73A9Qc.png) * 它同樣是一個暫存器,用於指示串行通信的控制和狀態。 * **UCSR0B** 暫存器比較重要的是 **RXEN0** 和 **TXEN0**,這兩個位元用來啟用接收器 (receiver) 和發射器 (transmitter),一般來說,我們會啟用這兩個元,可以用來開啟傳送、接收的位元。 * **UDRIE0** (USART Data Register Empty Interrupt Enable 0) : 決定要不要啟用中斷的位元。如果 **UDRIE0** 設置為 1,則允許UDRIE0標誌中斷。 ### UDR0(USART I/O Data Register 0) ![](https://i.imgur.com/4BfEyf4.png) * 它是用來存放資料的暫存器。 * **TXB** 和 **RXB** 具有相同的 I/O address (共用UDR0)。 * 當寫入資料到 **UDR0** 時,資料會寫入**TXB register**。 * 當要讀取 **UDR0** 的內容時,實際上是從 **RXB register** 讀取內容。