UART 串列通訊

學習如何學習!

串列通訊

串列通訊就是1次只傳送1位元的資料, 假設1 byte(8 bit) 的資料要傳送到對方,如果想要一次就把 8 bit 都送過去(並列),就至少需要 8 條資料線的電路連線,但如果使用串列通訊,只需要1條資料線,但要把8bit 分成8次傳送。 串列通訊的優點就是連接線較少,缺點就是通訊速度較慢(USB 也是串列通訊,速度也是越來越快了)

同步/非同步

串列通訊除了需要1條資料線外,還需要1條訊號線才能運作,這條訊號線通常稱為 clock。clock 訊號是用來確保傳送和接收方能同步的一種方法,不然接收方會不知道傳送方何時送資料過來。這種通訊方式稱為 USRT(Universal Synchronous Receiver/Transceiver) 通用同步串列通訊。

如果把 clock 訊號線省掉呢?,不要 clock 訊號線 也能把資料串列傳送呢?可以的,只要傳送與接收方先設定好傳送速度,再用相同的速度來傳送、接收資料就行!這種方式的串列通訊稱為 UART (Universal Asynchronous
Receiver / Transmitter)(同步通訊就有clock線的通訊,非通步通訊就是沒有clock線的通訊)

鮑率

所以要使用 UART 通訊,就必需要設定相同的通訊速度( 鮑率 baud),1 鮑率 即指每秒傳輸1個符號(bit),以38400 bps ,表示每秒鐘傳送38400個 bit,每一個 bit 的時間就是 1/38400 = 26 us,也就是說,接收方每隔 26us 就讀一個 bit。傳送、接收雙方必需設定相同的鮑率,才能正常工作。如果你用 9600 bps 的速度來接收用 38400 bps 傳送的訊號,會收到一堆亂碼。有些 UART 界面可以經由觀察收到的訊號來預測鮑率 ,然後自動設定對應的速度(auto baud),避免鮑率設定不同而無法傳送 。

UART 傳送封包格式,包含1bit啟始位元+8bit資料位元+1bit停止位元
UART 傳送封包格式,包含1bit啟始位元+8bit資料位元+1bit同位位元 +1bit停止位元

啟始位元

雖然約定好傳送速度(鮑率),但何時才開始傳送也是相當重要,因此 UART 上傳輸 1筆資料(1個封包)時,會有一個啟始位元,來通知接收方,讓它知道要開始傳送資料了。UART 沒有傳送資料時,是維持在 高電位(High) 的狀態,也就是所謂的「idle high」。 當要開始傳送時,會從高電位變成低電位,接收方只要檢測到電位的改變,就知道要開始傳送資料了, UART 的啟始位元固定是 1位元(bit)(如上圖)。

資料位元

資料位元包含所傳輸的實際資料,在大多數情況下,資料以最低有效位元優先方式發送。

同位位元

同位位元有兩種模式:偶同位(even) 和 奇同位(odd),偶同位就是包含同位位元, 要讓整個封包字元中的「1」個數爲偶數。比方說我們傳送的資料是 10011000,總共 8 個 bit,其中有 3 個 1,如果此時同位位元的模式是偶同位時,同位位元就要設爲 1,好讓整組字元變成 100110001,(裡面總共包含了 4 個1)。同理, 如果此時同位位元的模式是奇同位時,同位位元就要設爲 0,好讓整組字元變成 100110000,(裡面總共包含了 3 個1)。

如果這組封包在傳送過程當中出現錯誤,其中一個 bit 從 0 變成了 1,接收端在接收時會發現整個字元裡 1 的個數不是偶數,或不是奇數,就可以判斷傳輸過程發生問題,必需重傳。但資料裡面有 2 個位元都出了問題,那麼它就無法判斷。

停止位元

表示資料封包結束, UART 的發送方會將資料傳輸線從低電壓變成高電壓並保持1~2位元時間。

現況

現在 UART 很少使用同位位元來偵錯了。常見的「38400,8,N,1」這種設定,意思就是 38400 bps 的鮑率、8 個資料位元,N 則代表沒有同位位元,1 是 1 個停止位元的意思;現在其實已經很少看到後面不是「8,N,1」的設定,因為 同位位元已經幾乎不再使用,而 8 個資料位元和 1 個停止位元也幾乎成爲標準。

接線

由上可知,只要一條資料線就可以傳送資料,但只有單純的傳送或接收,如果你的裝置要同時可以傳送與接收,就必需要有2條資料線。假設裝置A要與裝置B通訊,且可以傳送與接收,那裝置A的傳送(TX)要接到裝置B的接受(RX),裝置A的接收(RX)要接到裝置B的傳送(TX)(如下圖)

入門
知識
語法
流程
函式
實習

發佈留言