大家好,我是小麥。
在嵌入式開發(fā)中,經(jīng)常會用到串口通訊。面對不同應用場景,需要不同的方案。
今天我們來講一下高效,可靠,安全的方案,記得看到最后,會有收獲。
常見的有串口輪詢模式,串口中斷模式,串口DMA接收傳輸?shù)鹊龋?/p>
利用串口的空閑中斷配合DMA的環(huán)形緩沖區(qū)模式,可以高效接收不固定長度的消息報文
下圖中經(jīng)過黃色的高電平時間空閑之后,就會產(chǎn)生一個空閑事件,IDLE EVENT
空閑信號
因為DMA功能有HC和TC中斷;
-
HC(Harf Complete)DMA傳輸一半成功標志; -
TC(Total Complete) DMA傳輸完成成功標志;
舉個例子;
如下圖所示,這里分配了一個DMA緩沖區(qū),大小是12字節(jié),如果從地址1開始接收,會出現(xiàn)以下這兩種情況;
- DMA接收到第6個字節(jié)的時候,會觸發(fā)HC事件;
- DMA接收到第12個字節(jié)的時候,會觸發(fā)TC事件;
HC TC這個思路其實我之前也有實踐過,但是沒有很好地利用HC和TC事件。
所以無法處理這種情況,即DMA緩沖區(qū)處于環(huán)形模式(Circular)的時候,數(shù)據(jù)覆蓋的問題,最近看到了一個非常棒的開源項目,這里的思路非常不錯,下面會詳細介紹。
下面是DMA HC/DMA TC/Idle組合進行串口接收的細節(jié),如下圖所示;
來自原項目再次簡單介紹一下縮略詞的含義;
-
R讀取; -
W寫入; -
I空閑信號; -
HTHalf-Transfer complete DMA緩沖區(qū)半傳輸完成; -
TCTransfer-Complete DMA緩沖區(qū)全部接收完成;
這里簡單介紹一下情況E的解決方案,上面圖片最右邊小圖;
-
緩沖區(qū)大小20格,這里假設20字節(jié),情況E需要接收30個字節(jié),也就是說,10字節(jié)可能會被覆蓋;
-
經(jīng)過前面的四次接收后,串口繼續(xù)從字母R處接收數(shù)據(jù)至DMA緩沖區(qū);
-
接收4字節(jié)時,會觸發(fā)
TC事件,這時候可以將4字節(jié)數(shù)據(jù)處理;
第一步 -
因為是環(huán)形模式,所以回到第一個字節(jié)處,繼續(xù)接收10字節(jié),觸發(fā)
HT事件,這時候可以處理10字節(jié)數(shù)據(jù);
第二步 -
第三步,繼續(xù)接收10字節(jié),觸發(fā)
TC事件,其中,已經(jīng)有4字節(jié)被覆蓋(下圖橙色所示),因為之前這部分數(shù)據(jù)已經(jīng)處理了,所以,即使覆蓋也不影響;
第三步 -
第四步,上述已經(jīng)接收了24個字節(jié),所以還有6個字節(jié)沒有接收,后面接收會產(chǎn)生空閑信號,并對之前的數(shù)據(jù)區(qū)域進行覆蓋,如下圖示所示;

所以,不難發(fā)現(xiàn),如果只使用空閑中斷,如果需要接收的數(shù)據(jù)長度大于緩沖區(qū),就會出現(xiàn)數(shù)據(jù)覆蓋的情況,而加上DMA的HT和TC中斷,就完美解決了這樣的問題;
當然除了這些,還有很多優(yōu)秀的方案,這個項目提供大量的例子。
項目地址:https://github.com/MaJerle/stm32-usart-uart-dma-rx-tx
項目主頁目前這個項目主要支持主流的STM32芯片平臺和一些開發(fā)板上的測試DEMO,具體如下所示;
支持平臺相應的例子程序如下所示,除了裸機程序,還有環(huán)形緩沖區(qū)接收,輪詢接收,DMA+空閑中斷基于RTOS的模式接收,挺豐富的,可以參考一下;
例子程序作者在 STM32F413-Nucleo 開發(fā)板進行程序的測試,發(fā)現(xiàn)優(yōu)化效果很不錯;
在115200的串口波特率下,每秒發(fā)送1581個字節(jié),大約142ms;
- 不使用DMA,CPU負載14%;
- 使用DMA,CPU負載0%;
最后,這個項目目前是基于STM32CubeIDE創(chuàng)建的,記得搭建一下環(huán)境。如果無法下載,公眾號后臺回復【高效串口】獲取項目代碼。
Enjoy : )
原文標題:高效,可靠,安全的串口通訊開源方案
文章出處:【微信公眾號:小麥大叔】歡迎添加關注!文章轉載請注明出處。
-
嵌入式
+關注
關注
5198文章
20449瀏覽量
334122 -
串口通訊
+關注
關注
2文章
266瀏覽量
26380 -
dma
+關注
關注
3文章
582瀏覽量
105937
原文標題:高效,可靠,安全的串口通訊開源方案
文章出處:【微信號:knifewheat,微信公眾號:小麥大叔】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
嵌入式開發(fā)調試經(jīng)驗分享
基于ARM的嵌入式開發(fā)
嵌入式開發(fā)
學嵌入式開發(fā)入門_學嵌入式開發(fā)需要看哪些書籍
嵌入式開發(fā)好學嗎_嵌入式開發(fā)職業(yè)發(fā)展方向是什么
嵌入式開發(fā)的產(chǎn)品有哪些_嵌入式開發(fā)的流程
嵌入式開發(fā)(一):嵌入式開發(fā)新手入門
嵌入式開發(fā)資料免費分享
嵌入式開發(fā)putty串口打印亂碼
嵌入式開發(fā)(一):嵌入式開發(fā)新手入門(轉載后續(xù)需要修改補充)
python做嵌入式開發(fā)_Python和嵌入式的區(qū)別是什么?可以做嵌入式開發(fā)嗎?
嵌入式開發(fā)中串口通訊方案
評論