在很多單片機系統(tǒng)中,都會提供UART Read和UART Write這樣的接口函數(shù)。一些高級的單片機甚至還有UART Read Callback和UART Write Callback這樣的回調函數(shù)來收發(fā)數(shù)據(jù)。通常很多單片機的數(shù)據(jù)處理能力相對UART通信來說要快得多,因此像采用上述接口函數(shù)的單片機系統(tǒng)都使用了數(shù)據(jù)緩存來輔助UART收發(fā)。常見的UART收發(fā)方式有這幾種:
1、數(shù)據(jù)隊列(Queue)收發(fā)
這種方式適合大多數(shù)單片機,只要有中斷就行。使用UART Write發(fā)送數(shù)據(jù)時,數(shù)據(jù)并不是直接寫入到UART發(fā)送器,而是放進了一個環(huán)形緩沖區(qū)中。然后在UART TX發(fā)送完畢中斷服務函數(shù)中讀取環(huán)形緩沖區(qū)并把讀到的字節(jié)送入UART發(fā)送器,然后等待TX發(fā)送完畢中斷服務函數(shù)再次執(zhí)行時送入下一個字節(jié),直到把環(huán)形緩沖區(qū)的數(shù)據(jù)送完為止。環(huán)形緩沖區(qū)通常有一個標記頭和尾的變量,只要頭和尾的變量值不相等就說明緩沖區(qū)有數(shù)據(jù)。使用UART Read接收數(shù)據(jù)時,也不是直接從UART接收器中獲取數(shù)據(jù),而是從環(huán)形緩沖區(qū)中獲取數(shù)據(jù)。UART RX收到中斷服務函數(shù)中把UART接收器收到的字節(jié)送進環(huán)形緩沖區(qū),單片機執(zhí)行UART Read時獲取到的數(shù)據(jù)是環(huán)形緩沖區(qū)的數(shù)據(jù),這樣可以保證單片機程序不用一直等待UART接收器。這種設計的優(yōu)點是可以有效地處理實時數(shù)據(jù),避免了數(shù)據(jù)的丟失。但是,如果Queue的大小設置不當,可能會導致數(shù)據(jù)的溢出。因此,我們需要根據(jù)實際的應用場景來合理地設置Queue的大小。
2、帶硬件FIFO的UART收發(fā)
很多先進的單片機的UART收發(fā)用上了硬件FIFO。沒有硬件FIFO的單片機在收發(fā)數(shù)據(jù)時每收發(fā)一個字節(jié)就要執(zhí)行一次中斷函數(shù),在高波特率通信時單片機會頻繁進入中斷,從而影響單片機主任務的處理。而硬件FIFO則可以緩解這種矛盾。例如單片機的UART FIFO是16字節(jié),單片機在發(fā)送數(shù)據(jù)時一次最多可以傳輸16字節(jié)數(shù)據(jù),等16字節(jié)數(shù)據(jù)發(fā)送完畢后才產生UART TX發(fā)送完畢中斷。接收數(shù)據(jù)時通常是“半滿”中斷和“超時”中斷,即接收FIFO中的字節(jié)數(shù)超過8字節(jié),或者接收FIFO不為空但是超過1字節(jié)的時間內沒有收到新的字節(jié)數(shù)據(jù),產生一次UART RX接收中斷。通常帶硬件FIFO的UART會和數(shù)據(jù)隊列的方式相結合使用,在高波特率通信下傳輸效率更高。
3、帶DMA的UART收發(fā)
DMA(Direct Memory Access)是一種可以將計算機的某個存儲區(qū)域直接映射到內存地址空間的技術,從而實現(xiàn)對內存和其他外設的統(tǒng)一訪問。當UART接收到數(shù)據(jù)時,數(shù)據(jù)會被直接寫入到DMA控制的內存區(qū)域中,然后觸發(fā)中斷。在中斷服務程序中,我們可以從DMA控制的內存區(qū)域中取出數(shù)據(jù),進行必要的處理,然后再通過UART發(fā)送出去。
使用DMA進行UART傳輸對連續(xù)多條數(shù)據(jù)的傳輸幫助特別大,例如前面提到的UART Read Callback和UART Write Callback回調函數(shù)的方式。連續(xù)發(fā)送多條數(shù)據(jù)流時,可以把數(shù)據(jù)流放在單片機的多個不同的緩沖區(qū),然后DMA直接指向緩沖區(qū)地址,待DMA傳輸完畢后產生UART Write Callback,然后在UART Write Callback中把DMA指向下一個緩沖區(qū)地址。接收數(shù)據(jù)時也可以預約一個接收緩沖區(qū),DMA傳輸?shù)臄?shù)據(jù)傳輸?shù)皆摼彌_區(qū),傳輸滿了后產生UART Read Callback再指向下一個接收緩沖區(qū),同時可以讓單片機主程序處理已收滿數(shù)據(jù)的緩沖區(qū)的內容。
審核編輯:黃飛
-
單片機
+關注
關注
6065文章
44934瀏覽量
647581 -
uart
+關注
關注
22文章
1270瀏覽量
103362 -
數(shù)據(jù)緩存
+關注
關注
0文章
24瀏覽量
7321 -
發(fā)送器
+關注
關注
1文章
261瀏覽量
27169
發(fā)布評論請先 登錄
RS485和RS232uart中斷方式的半雙工收發(fā)數(shù)據(jù) 接到數(shù)據(jù)原樣返回
STM32 UART串口收發(fā)與中斷方式接收環(huán)境
如何去實現(xiàn)UART阻塞方式收發(fā)數(shù)據(jù)呢
UART收發(fā)器設計實例

UART的收發(fā)數(shù)據(jù)操作介紹

UART收發(fā)器的設計實例詳細說明

【CubeIDE】STM32 HAL庫史上最詳細教程(一):UART串口收發(fā)

UART通用異步收發(fā)器原理是什么

常見通信的底層數(shù)據(jù)傳輸原理(UART、SPI、I2C)

評論