UART通訊資料傳輸

一、了解通訊的格式

很多時候在使用UART傳送資料的時候,無論是高階軟體,如VB、C#等或者是偏向硬體的MCU,在傳送前我們必須先理解,在兩個設備間通訊時所使用的通訊協定,也就是說要相互傳遞的資料格式為何?是ASCII還是數值?通常這是必須先定義出來之後,才有辦法開始撰寫通訊程式。

uart

二、ASCII與數值的分別

ASCII指的是文字標準編碼(參考維基百科),而數值指的就是單純的數字,也就是說在程式設計中,假使今天要透過UART傳送資料「11」時如果是以數值方式傳送時,則UART會送出00001011b也就是十進制數值的11,那假使今天傳送的是「11」的ASCII時,則UART會送出00110001 00110001b,也就是0x3131,因為在ASCII的編碼中1即為0x31這個值,所以說如果不先搞清楚傳送的格式是ASCII或者是數值時,則會產生很嚴重的通訊錯誤問題。

ASCII "11" = 00110001 00110001b

Value 11 = 00001011b

三、UART傳送的波形

如果會解析UART傳送波形的話,有時候在硬體除錯上可能會有一點幫助,UART的波形在OSI模型中,屬於物理層,也就是最底層的部分,屬於實際電器特性傳輸之訊號。 UART傳送時,通常我們會有1Start Bit+8Bit data+1Stop Bit構成一個封包,所以通常情況下(因有時Stop Bit不是一個),一個完整的UART封包為10bit。 解析波形時,我們必須先理解其傳送的BaudRate速度,才能夠去判讀示波器上的波形,以下範例均使用9600bps作為解說,期會用9600bps原因為,當傳送1byte時,其所用時間約1ms,比較容易從示波器上區分波形。 關於UART BaudRate計算可參考先前的文章

波形範例:send 0x01

下圖的範例是傳送一數值01

20140505_130601

波形範例:send 0x05

下圖的範例是傳送一數值05,使用05的原因是因為容易區隔方便辨識 20140505_130647

波形範例:send 0x01,0x05

下圖是一連續傳送0x01,0x05兩個byte之UART波形 20140505_130817

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料