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