通用異步收發器(Universal Asynchronous Receiver/Transmitter),通常稱作UART,是一種串行、異步、全雙工的通信協議,在嵌入式領域應用的非常廣泛。
UART作為異步串行通信協議的一種,工作原理是將傳輸數據的每個二進制位一位接一位地傳輸。在UART通信協議中信號線上的狀態為高電平時代表‘1’,信號線上的狀態為低電平時代表‘0’。比如使用UART通信協議進行一個字節數據的傳輸時就是在信號線上產生八個高低電平的組合。
串行通信是指利用一條傳輸線將數據一位位地順序傳送,也可以用兩個信號線組成全雙工通信,如rs232。特點是通信線路簡單,利用簡單的線纜就可實現通信,降低成本,適用於遠距離通信,但傳輸速度慢的應用場合。
異步通信以一個字符為傳輸單位,通信中兩個字符間的時間間隔多少是不固定的,然而在同一個字符中的兩個相鄰位間的時間間隔是固定的。通俗說是兩個uart設備之間通信的時候不需要時鍾線,這時候就需要在兩個uart設備上指定相同的傳輸速率,以及空閑位、起始位、校驗位、結束位,也就是遵循相同的協議。
數據傳送速率用波特率來表示,即每秒鍾傳送的二進制位數。例如數據傳送速率為120字符/秒,而每一個字符為10位(1個起始位,7個數據位,1個校驗位,1個結束位),則其傳送的波特率為10×120=1200字符/秒=1200波特。
數據通信格式如下圖:

其中各位的意義如下:
空閑位:
UART協議規定,當總線處於空閑狀態時信號線的狀態為‘1’即高電平,表示當前線路上沒有數據傳輸。
起始位:
每開始一次通信時發送方先發出一個邏輯”0”的信號(低電平),表示傳輸字符的開始。因為總線空閑時為高電平所以開始一次通信時先發送一個明顯區別於空閑狀態的信號即低電平。
數據位:
起始位之后就是我們所要傳輸的數據,數據位可以是5、6、7、8,9位等,構成一個字符(一般都是8位)。如ASCII碼(7位),擴展BCD碼(8位)。先發送最低位,最后發送最高位,使用低電平表示‘0’高電平表示‘1’完成數據位的傳輸。
奇偶校驗位:
數據位加上這一位后,使得“1”的位數應為偶數(偶校驗)或奇數(奇校驗),以此來校驗數據傳送的正確性。校驗位其實是調整個數,串口校驗分幾種方式:
1、無校驗(no parity)。
2、奇校驗(odd parity):如果數據位中“1”的數目是偶數,則校驗位為“1”,如果“1”的數目是奇數,校驗位為“0”。
3、偶校驗(even parity):如果數據為中“1”的數目是偶數,則校驗位為“0”,如果為奇數,校驗位為“1”。
4、mark parity:校驗位始終為1(不常用)。
5、parity:校驗位始終為0(不常用)。
停止位:
它是一個字符數據的結束標志。可以是1位、1.5位、2位的高電平。 由於數據是在傳輸線上定時的,並且每一個設備有其自己的時鍾,很可能在通信中兩台設備之間出現了小小的不同步。因此停止位不僅僅是表示傳輸的結束,並且提供計算機校正時鍾的機會。停止位個數越多,數據傳輸越穩定,但是數據傳輸速度也越慢。
波特率:
數據傳輸速率使用波特率來表示。單位bps(bits per second),常見的波特率9600bps、115200bps等等,其他標准的波特率是1200,2400,4800,19200,38400,57600。舉個例子,如果串口波特率設置為9600bps,那么傳輸一個比特需要的時間是1/9600≈104.2us。

以9600,8-N-1(9600波特率,8個數據位,沒有校驗位,1位停止位)為例,這是目前最常用的串口配置,現在我們傳輸“O”“K”兩個ASCII值,“O”的ASCII為79,對應的二進制數據為01001111,“K”對應的二進制數據為01001011,傳輸的格式數據如下圖所示:

串口波特率為9600,1bit傳輸時間大約為104us,傳送一個數據實際是10個比特(開始位-8個數據位-停止位),一個bytes傳輸速率實際為9600*8/10=7680bps。
UART傳輸協議的特點如下:
1.因為UART沒有時鍾信號,無法控制何時發送數據,也無法保證雙發按照完全相同的速度接收數據。因此,雙方以不同的速度進行數據接收和發送,就會出現問題。
如果要解決這個問題,UART為每個字節添加額外的起始位和停止位,以幫助接收器在數據到達時進行同步;
2.雙方還必須事先就傳輸速度達成共識(設置相同的波特率,例如每秒9600位);
3.傳輸速率如果有微小差異不是問題,因為接收器會在每個字節的開頭重新同步。
4.串口協議通常會首先發送最低有效位;
5.異步串行工作得很好,但是在每個字節發送的時候都需要額外的起始位和停止位以及在發送和接收數據所需的復雜硬件方面都有很多開銷。
6.不難發現,如果接收端和發送端設置的速度都不一致,那么接收到的數據將是垃圾(亂碼)。
