前言
最近在做一個通過ESP8266和STM32通訊從而實現遠程控制,中間需要用到串口來發送報文,通過報文來實現兩者之間的通訊。
今天剛好趁著這個機會來給大家講解一下串行通訊,希望能給大家以后的學習提供一些思路。
串行通訊介紹
串口通信線最少需要2根(GND和信號線),可以實現單工通信,也可以使用3根通信線(Tx、Rx、GND)來實現全雙工。
通過串口不管發數字、文本還是命令,都要先對發送內容進行編碼,編碼成二進制再進行逐個位的發送。我們使用串口發送的一般都是字符,都是ASCII碼編碼后的字符,所以一般設置數據位都是8,方便剛好一幀發送1個字符。
那么現在我們就知道了,如果我們想要串口進行通訊,我們首先需要將我們想要發送的信息轉換成為ASCII碼,再通過串口線將信息以二進制的形式發送出去。
UART作為異步串口通信協議的一種,工作原理是將傳輸數據的每一個字符一位一位地傳輸,也就是我們上面說的ASCII碼編碼。其中每一位(bit)的意義如下:
起始位:先發出一個邏輯“0”的信號,表示傳輸字符開始。
數據位:緊接著起始位之后。數據位的個數可以是4、5、6、7、8等,構成一個字符。
奇偶校驗位:數據位加上這一位后,使得“1”的位數應為偶數(偶校驗)或奇數(奇校驗),依次來校驗數據傳送的正確性。
停止位:它是一個字符數據的結束標志。可以是1位、1.5位、2位的高電平。
空閑位:處于邏輯“1”狀態,表示當前線路上沒有數據傳輸。
其中數據位通常采用ASCII碼。從最低位開始傳送,靠時鐘定位。
串行數據傳輸的基本模式
二進制脈沖用于串行數據傳輸中的數據傳輸。二進制數字一由五伏或高邏輯表示。相反,二進制零表示為邏輯低電平或零伏。為了實現串行通信,需要源和目標。他們也被稱為發送者和接收者。可以采用各種類型的串行通信,并指定為單工、半雙工和全雙工。
Simplex 方法單向數據傳輸。在此方案中,在任何給定時間只有源或目標處于活動狀態。如果源正在發送數據,接收方別無選擇,只能接受傳輸。廣播電視或無線電信號時使用單工模式。
半雙工模式允許源和目標都處于活動狀態,但不能同時處于活動狀態。傳輸一次只發生在一個方向。使用互聯網時可以看到一個恰當的例子。當您從計算機發出網頁請求時,服務器會處理該請求。然后,當將信息返回到您的計算機(現在是接收方)時,它就成為發送方。
全雙工模式是世界上使用最廣泛的串行通信形式。源和目標都處于活動狀態,可以同時發送和接收數據。您的智能手機是全雙工模式實際應用的典型示例。
討論串行通信時的另一個考慮因素是兩臺主機的協議和字節順序。字節順序是指使用特定的內存地址來存儲數據的方法。這是將數據存儲在特定內存地址的方式。關于數據對齊字節序有兩種分類。
UART串口通信的工作原理
(1)發送數據過程
空閑狀態,線路處于高電平;當收到發送指令后,拉低線路的一個數據位的時間T,接著數據按低位到高位依次發送,數據發送完畢后,接著發送奇偶校驗位和停止位,一幀數據發送完成。
(2)數據接收過程:
空閑狀態,線路處于高電平;當檢測到線路的下降沿(高電平變為低電平)時說明線路有數據傳輸,按照約定的波特率從低位到高位接收數據,數據接收完畢后,接著接收并比較奇偶校驗位是否正確,如果正確則通知后續設備接收數據或存入緩沖。
串行通訊和并行通訊
在常見的通訊中有兩種基本的數據傳輸形式,分別是并行和串行通信。串行通信是逐位進行數據傳輸。它基本上使用兩根電線,一根用于發送器,另一根用于接收器。
串行通信:計算機與I/O設備之間,同一時刻,只能傳輸一個bit位的信號。傳輸數據按順序依次一bit位接一bit位進行傳輸,通常數據在一根數據線或一對差分線上傳輸。
比如,當傳輸1字節信息時,并行通訊有8根信號線實現同時傳輸,假如耗時為1T,而串行是在一根信號線上,把數據排成一行、一位一位傳輸,需要傳8次,因此耗時為8T。
并行通信:計算機與I/O設備之間,通過多條傳輸線,可以同時傳輸多個bit位的信號。
并行通訊的效率高,但是成本高、對信號線路要求高,一般應用于快速設備之間近距離傳輸,譬如CPU 與存儲設備、存儲器與存儲器、主機與打印機等都采用并行通訊。
串行通訊效率較低,但是對信號線路要求低,抗干擾能力強,同時成本也相對較低,一般用于計算機與計算機、計算機與外設之間遠距離通訊。
單片機中的串口通訊
大家需要注意這里的串口通訊和我們上面談到的串行通訊不是一個東西,串口通訊是串行通訊中的一種,在單片機調試中非常常見,也是學習單片機必須進行學習的知識,這里我們以單片機中常用的RS-232串口來進行講解。
在上面的通訊方式中,兩個通訊設備之間通過串口信號線建立起連接,串口信號線中使用"RS-232標準"傳輸數據信號。由于RS-232電平標準的信號不能直接被控制器直接識別,所以這些信號會經過一個"電平轉換芯片"轉換成控制器能識別的"TTL校準"的電平信號,才能實現通訊。
我們知道常見的電子電路中常使用TTL的電平標準,理想狀態下,使用5V表示二進制邏輯1,使用0V表示邏輯0;而為了增加串口通訊的遠距離傳輸及抗干擾能力,它使用-15V表示邏輯1,+15V表示邏輯0。
因為控制器一般使用TTL電平標準,所以常常會使用CH340芯片對TTL及RS-232電平的信號進行互相轉換。
分析串口通訊波形
在分析波形之前我們先來看一些基礎概念,這樣有利于我們對波形的分析:
起始位:先發出一個邏輯”0”的信號,表示傳輸數據的開始。
校驗位:數據位加上這一位后,使得“1”的位數應為偶數(偶校驗)或奇數(奇校驗),以此來校驗數據傳送的正確性。就比如傳輸“A”(01000001)為例。(字符‘A’的二進制是 0100 0001)此位還可以去除,即不需要奇偶校驗位。
當為奇數校驗:”A”字符的8個bit位中有兩個1,那么奇偶校驗位為1才能滿足1的個數為奇數(奇校驗)。
當為偶數校驗:”A”字符的8個bit位中有兩個1,那么奇偶校驗位為0才能滿足1的個數為偶數(偶校驗)。
停止位:它是一幀數據的結束標志。可以是1bit、1.5bit、2bit的空閑電平。
空閑位:沒有數據傳輸時線路上的電平狀態,為邏輯1。
傳輸方向:即數據是從高位(MSB)開始傳輸還是從低位(LSB)開始傳輸。
uart數據傳輸格式:剛開始傳輸一個起始位——傳輸數據位——校驗位(可不需要此位)——停止位。這樣一幀的數據就傳輸完了。接下來接著像這樣一直傳送。
波形1
用串口工具發送0XD6,即二級制 1101 0110 ,在示波器上如此顯示。
串口設置:波特率9600,停止位1位,無奇偶校驗位。
波形如圖所示:
由示波器可以看出,最左邊一個低電平表示0,起始位;然后依次是0110 1011,正好和發送的數據最高位和最低位反過來,至于為什么會反過來我們上面也介紹過了,相比大家也能夠理解。
波形2
用串口發送0x75,就是二進制 0111 0101,如下圖所示。
串口設置:波特率9600,停止位1位,無奇偶校驗位。
同理,最左側的為起始位,低電平0, 然后LSB傳輸。1010 1110依次傳輸到示波器。
波形3
用串口發送0x75,就是二進制 0111 0101,
串口設置:波特率9600,停止位1位,奇校驗。
奇校驗就是要保證這一幀里的所有BIT 有1的數為奇數,0x75已經有5個1了,所以奇偶校驗位為0即可。
如果為偶校驗,那么最后一位應該是高電平1,就會有6個1,以此保證所有的1的數量為偶數。
波形4
連發發送兩個16進制數據0x75(0111 0101) 0x6B (0110 1011)
串口設置:波特率9600,停止位1位,無奇偶校驗位。
結語
當然串行通訊不僅這一種,還是很多其他的例如I2C、SPI、CAN等,大家可以多了解一下,每個通訊方法都有著自己的通訊協議,我們如果想要使用的話需要根據自己實際需求,選擇合適的通訊方式。
審核編輯 :李倩
-
數據傳輸
+關注
關注
9文章
1919瀏覽量
64671 -
通信
+關注
關注
18文章
6041瀏覽量
136124 -
串口
+關注
關注
14文章
1555瀏覽量
76647
原文標題:串行通訊講解與分析,看了就明白了!
文章出處:【微信號:嵌入式悅翔園,微信公眾號:嵌入式悅翔園】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論