軟體模擬序列通訊 UART協議實現

2021-08-11 21:06:58 字數 3178 閱讀 9777

起因

雙微控制器通訊,mcu資源受限,無法使用片上uart通道,只可用普通i/o

成果

使用2個普通i/o埠,通過軟體實現uart協議的資料全雙工收發,8bits資料位、1600波特率,可移植其它微控制器

資源占用

·1個定時器

·2個普通i/o埠

ide

keil v4

硬體

51最小系統板

一、uart協議

二、思路

1>資料的傳送其實就是控制傳送引腳ptxd的電平隨著固定時序變化,那麼固定的、週期性的時序需要乙個定時器來產生。為了保證定時器週期高精度穩定可控,選用自動重灌定時器模式 。為了盡可能的減少資源占用,傳送和接收共用乙個定時器資源。

2>程式的設計採用狀態機設計模式,這樣可以避免獨佔cpu,並且利於移植到各種狀態機系統。狀態遷移程式在isr中實現。  

3>定時器的中斷頻率為波特率的3倍[之所以這樣做後面介紹接收時詳述]。

4>開啟傳送之後,isr中傳送相關程式得到執行,每3次中斷處理1bit.根據時序,先產生bit0[起始位],然後根據8bit型資料依次在時序線上控制ptxd的電平高低。資料位傳送完畢後,若設定了校驗位,則對8bits資料中bit1的數量進行判斷,根據奇偶校驗對bit1的數量通過控制prxd的電平進行奇偶補全[傳送資料位時對bit1進行計數]。然後根據設定傳送對應長度的bit1[停止位]。最後,判斷傳送資料是否達到傳送長度,若傳送長度到達,則結束傳送程式執行,否則繼續迴圈傳送。

5>開啟接收之後,isr中接收相關程式得到執行,並與傳送程式互不干涉。首先每次中斷都判斷prxd的電平是否置低[檢測起始位],當檢測到bit0之後,四個中斷後進行資料位最低位的接收。這裡之所以選擇四個中斷的延時,是因為當檢測到bit0[起始位]的時刻,不管此時處於實際起始位的哪個時間點位置,四個中斷後即下一次判斷的位置總會是最接近一位資料中心那個點[乙個bit中有三次中斷點,有乙個最接近中心,越接近中心越能免受傳送與接收波特率不同步的影響,具體細節畫圖可知]。之後的每一位改為每三個中斷進行一次判斷處理[與波特率同步]。處理到校驗位時,如果設定了奇偶校驗,則對校驗結果輸出至設定好的校驗標誌位中,外圍程式可根據此標準位判斷是否校驗出錯。然後判斷接收資料的長度是否達到設定長度,若沒有,則等待至prxd變為高電平後繼續迴圈接收。

三、**[關鍵部分]

static void xuart_isr(void) interrupt 3

else

if(cntsend_i >= 7)

}else

break;

// 奇校驗

case 2:

if((cntbit1 % 2) == 0) // 偶數個1

else

cntbit1 = 0;

seqsend = 4;

break;

// 偶校驗

case 3:

if((cntbit1 % 2) == 0) // 偶數個1

else

seqsend = 4;

break;

// 停止位

case 4:

cntbit1 = 0;

switch(xuart_config.bit_stop)

break;

default:

//seqsend = 5;

break;

}ptxd = high;

break;

// 下一幀or結束

case 5:

if(cntsend_j >= len_send - 1) // 傳送完畢處理

else

seqsend = 0;

break;

default:

seqsend = 0;

cntsend_i = 0;

cntsend_j = 0;

cntbit1 = 0;

fsend_end = set;

fsend = clr;

tr1 = 0;

} } }

/**************************receive*************************/

if(freceive == set)

break;

// 8bits_bit1資料

case 1:

if(++cntrec == 4) // 第一次進來時為4個週期,提公升容錯率

else

if(cntreceive_i >= 7) // 1幀接收完畢

}else

}break;

// 奇校驗

case 2:

if(++cntrec == 3) // 3個週期進入

else // 校驗錯誤

cntbit1_ = 0;

seqreceive = 4;

break;

}break;

// 偶校驗

case 3:

if(++cntrec == 3) // 3個週期進入

else // 校驗錯誤

seqreceive = 4;

break;

}break;

// 幀結束

case 4:

if(prxd == high)

else

seqreceive = 0;

break;

} break;

default:

break;

} }}

四、回環測試1.示波器

2.串列埠助手回環測試

UART通訊協議

第一部分 uart使用的是 非同步,序列通訊。序列通訊是指利用一條傳輸線將資料一位位地順序傳送。特點是通訊線路簡單,利用簡單的線纜就可實現通訊,降低成本,適用於遠距離通訊,但傳輸速度慢的應用場合。非同步通訊以乙個字元為傳輸單位,通訊中兩個字元間的時間間隔多少是不固定的,然而在同乙個字元中的兩個相鄰位...

Uart通訊協議

第一部分 uart使用的是 非同步,序列通訊。序列通訊是指利用一條傳輸線將資料一位位地順序傳送。特點是通訊線路簡單,利用簡單的線纜就可實現通訊,降低成本,適用於遠距離通訊,但傳輸速度慢的應用場合。非同步通訊以乙個字元為傳輸單位,通訊中兩個字元間的時間間隔多少是不固定的,然而在同乙個字元中的兩個相鄰位...

UART通訊協議

第一部分 uart使用的是 非同步,序列通訊。序列通訊是指利用一條傳輸線將資料一位位地順序傳送。特點是通訊線路簡單,利用簡單的線纜就可實現通訊,降低成本,適用於遠距離通訊,但傳輸速度慢的應用場合。非同步通訊以乙個字元為傳輸單位,通訊中兩個字元間的時間間隔多少是不固定的,然而在同乙個字元中的兩個相鄰位...