0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

嵌入式開發(fā)中串口通訊方案

小麥大叔 ? 來源:小麥大叔 ? 作者:小麥大叔 ? 2022-05-23 11:48 ? 次閱讀

大家好,我是小麥。

嵌入式開發(fā)中,經(jīng)常會(huì)用到串口通訊。面對(duì)不同應(yīng)用場(chǎng)景,需要不同的方案。

今天我們來講一下高效,可靠,安全的方案,記得看到最后,會(huì)有收獲。

常見的有串口輪詢模式,串口中斷模式,串口DMA接收傳輸?shù)鹊龋?/p>

利用串口的空閑中斷配合DMA的環(huán)形緩沖區(qū)模式,可以高效接收不固定長(zhǎng)度的消息報(bào)文

下圖中經(jīng)過黃色的高電平時(shí)間空閑之后,就會(huì)產(chǎn)生一個(gè)空閑事件,IDLE EVENT

f8522910-da49-11ec-ba43-dac502259ad0.png空閑信號(hào)

因?yàn)镈MA功能有HCTC中斷;

  • HCHarf Complete)DMA傳輸一半成功標(biāo)志;
  • TC (Total Complete) DMA傳輸完成成功標(biāo)志;

舉個(gè)例子;

如下圖所示,這里分配了一個(gè)DMA緩沖區(qū),大小是12字節(jié),如果從地址1開始接收,會(huì)出現(xiàn)以下這兩種情況;

  • DMA接收到第6個(gè)字節(jié)的時(shí)候,會(huì)觸發(fā)HC事件;
  • DMA接收到第12個(gè)字節(jié)的時(shí)候,會(huì)觸發(fā)TC事件;
f878edb6-da49-11ec-ba43-dac502259ad0.pngHC TC

這個(gè)思路其實(shí)我之前也有實(shí)踐過,但是沒有很好地利用HC和TC事件。

所以無法處理這種情況,即DMA緩沖區(qū)處于環(huán)形模式(Circular)的時(shí)候,數(shù)據(jù)覆蓋的問題,最近看到了一個(gè)非常棒的開源項(xiàng)目,這里的思路非常不錯(cuò),下面會(huì)詳細(xì)介紹。

下面是DMA HC/DMA TC/Idle組合進(jìn)行串口接收的細(xì)節(jié),如下圖所示;

f88bcecc-da49-11ec-ba43-dac502259ad0.png來自原項(xiàng)目

再次簡(jiǎn)單介紹一下縮略詞的含義;

  • R 讀取;
  • W 寫入;
  • I 空閑信號(hào);
  • HT Half-Transfer complete DMA緩沖區(qū)半傳輸完成;
  • TC Transfer-Complete DMA緩沖區(qū)全部接收完成;

這里簡(jiǎn)單介紹一下情況E的解決方案,上面圖片最右邊小圖;

  • 緩沖區(qū)大小20格,這里假設(shè)20字節(jié),情況E需要接收30個(gè)字節(jié),也就是說,10字節(jié)可能會(huì)被覆蓋;

  • 經(jīng)過前面的四次接收后,串口繼續(xù)從字母R處接收數(shù)據(jù)至DMA緩沖區(qū);

  • 接收4字節(jié)時(shí),會(huì)觸發(fā)TC事件,這時(shí)候可以將4字節(jié)數(shù)據(jù)處理;

    f89b99f6-da49-11ec-ba43-dac502259ad0.png第一步
  • 因?yàn)槭黔h(huán)形模式,所以回到第一個(gè)字節(jié)處,繼續(xù)接收10字節(jié),觸發(fā)HT事件,這時(shí)候可以處理10字節(jié)數(shù)據(jù);

    f8ae2346-da49-11ec-ba43-dac502259ad0.png第二步
  • 第三步,繼續(xù)接收10字節(jié),觸發(fā)TC事件,其中,已經(jīng)有4字節(jié)被覆蓋(下圖橙色所示),因?yàn)橹斑@部分?jǐn)?shù)據(jù)已經(jīng)處理了,所以,即使覆蓋也不影響;

    f8c07fa0-da49-11ec-ba43-dac502259ad0.png第三步
  • 第四步,上述已經(jīng)接收了24個(gè)字節(jié),所以還有6個(gè)字節(jié)沒有接收,后面接收會(huì)產(chǎn)生空閑信號(hào),并對(duì)之前的數(shù)據(jù)區(qū)域進(jìn)行覆蓋,如下圖示所示;f8df95e8-da49-11ec-ba43-dac502259ad0.png

所以,不難發(fā)現(xiàn),如果只使用空閑中斷,如果需要接收的數(shù)據(jù)長(zhǎng)度大于緩沖區(qū),就會(huì)出現(xiàn)數(shù)據(jù)覆蓋的情況,而加上DMA的HT和TC中斷,就完美解決了這樣的問題;

當(dāng)然除了這些,還有很多優(yōu)秀的方案,這個(gè)項(xiàng)目提供大量的例子。

項(xiàng)目地址https://github.com/MaJerle/stm32-usart-uart-dma-rx-tx

f9052b3c-da49-11ec-ba43-dac502259ad0.png項(xiàng)目主頁

目前這個(gè)項(xiàng)目主要支持主流的STM32芯片平臺(tái)和一些開發(fā)板上的測(cè)試DEMO,具體如下所示;

f919ab02-da49-11ec-ba43-dac502259ad0.png支持平臺(tái)

相應(yīng)的例子程序如下所示,除了裸機(jī)程序,還有環(huán)形緩沖區(qū)接收,輪詢接收,DMA+空閑中斷基于RTOS的模式接收,挺豐富的,可以參考一下;

f9537e9a-da49-11ec-ba43-dac502259ad0.png例子程序

作者在 STM32F413-Nucleo 開發(fā)板進(jìn)行程序的測(cè)試,發(fā)現(xiàn)優(yōu)化效果很不錯(cuò);

115200的串口波特率下,每秒發(fā)送1581個(gè)字節(jié),大約142ms;

  • 不使用DMA,CPU負(fù)載14%;
  • 使用DMA,CPU負(fù)載0%;

最后,這個(gè)項(xiàng)目目前是基于STM32CubeIDE創(chuàng)建的,記得搭建一下環(huán)境。如果無法下載,公眾號(hào)后臺(tái)回復(fù)【高效串口】獲取項(xiàng)目代碼。

Enjoy : )

原文標(biāo)題:高效,可靠,安全的串口通訊開源方案

文章出處:【微信公眾號(hào):小麥大叔】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5082

    文章

    19123

    瀏覽量

    305147
  • 串口通訊
    +關(guān)注

    關(guān)注

    1

    文章

    259

    瀏覽量

    24925
  • dma
    dma
    +關(guān)注

    關(guān)注

    3

    文章

    561

    瀏覽量

    100583

原文標(biāo)題:高效,可靠,安全的串口通訊開源方案

文章出處:【微信號(hào):knifewheat,微信公眾號(hào):小麥大叔】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    嵌入式開發(fā)調(diào)試經(jīng)驗(yàn)分享

    嵌入式開發(fā)過程中的一點(diǎn)調(diào)試經(jīng)驗(yàn)嵌入式開發(fā)最麻煩的在現(xiàn)場(chǎng)調(diào)試過程或?qū)嶋H運(yùn)營過程中出現(xiàn)問題很難定位。我在實(shí)際開發(fā)過程中一點(diǎn)經(jīng)驗(yàn)分享給大家嵌入式開發(fā)
    發(fā)表于 11-05 08:15

    嵌入式開發(fā)圣經(jīng)

    嵌入式系統(tǒng)開發(fā)圣經(jīng):嵌入式開發(fā)圣經(jīng)
    發(fā)表于 03-25 13:08 ?88次下載

    基于ARM的嵌入式開發(fā)

    基于ARM的嵌入式開發(fā):華清遠(yuǎn)見/孫天澤基于ARM的嵌入式開發(fā)內(nèi)容有:ARM簡(jiǎn)介,基于ARM的嵌入式產(chǎn)品,ARM架構(gòu),基于ARM的嵌入式開發(fā)
    發(fā)表于 10-04 08:49 ?83次下載

    嵌入式開發(fā)

    嵌入式開發(fā)就是指在嵌入式操作系統(tǒng)下進(jìn)行開發(fā),嵌入式Linux是以Linux為基礎(chǔ)的嵌入式作業(yè)系統(tǒng)。這里提供了
    發(fā)表于 12-20 13:21
    <b class='flag-5'>嵌入式開發(fā)</b>

    學(xué)嵌入式開發(fā)入門_學(xué)嵌入式開發(fā)需要看哪些書籍

    現(xiàn)在嵌入式開發(fā)越來越吃香,很多人都想要學(xué)習(xí)卻不知道要從何下手。本文分析了學(xué)習(xí)嵌入式軟件開發(fā)需要具備哪些基本知識(shí)和技能,開發(fā)學(xué)習(xí)的基本步驟,并給出了各種參考資料及網(wǎng)站,同時(shí)小編還推薦了學(xué)
    的頭像 發(fā)表于 04-04 10:25 ?2.5w次閱讀

    嵌入式開發(fā)好學(xué)嗎_嵌入式開發(fā)職業(yè)發(fā)展方向是什么

    本文首先來了解一下嵌入式前景及薪資待遇,其次解答了嵌入式開發(fā)好學(xué)不好學(xué)的問題,最后闡述了嵌入式開發(fā)必會(huì)知識(shí)以及嵌入式開發(fā)職業(yè)的四大發(fā)展方向,具體的跟隨小編一起來了解一下。
    的頭像 發(fā)表于 05-18 16:41 ?9182次閱讀

    嵌入式開發(fā)的產(chǎn)品有哪些_嵌入式開發(fā)的流程

    本文主要闡述了嵌入式開發(fā)的產(chǎn)品,其次介紹了嵌入式開發(fā)的流程。
    發(fā)表于 08-31 15:38 ?1.1w次閱讀

    嵌入式開發(fā)(一):嵌入式開發(fā)新手入門

    嵌入式開發(fā)環(huán)境及交叉編譯環(huán)境,開發(fā)完成后,編譯得到bin文件,然后在Windows下將bin文件通過串口或網(wǎng)絡(luò)下發(fā)到嵌入式板卡,程序在嵌入式
    發(fā)表于 10-14 10:58 ?79次下載
    <b class='flag-5'>嵌入式開發(fā)</b>(一):<b class='flag-5'>嵌入式開發(fā)</b>新手入門

    嵌入式開發(fā)資料免費(fèi)分享

    嵌入式開發(fā)資料免費(fèi)分享嵌入式工程師經(jīng)驗(yàn)分享:如何學(xué)習(xí)嵌入式開發(fā)截取文檔部分學(xué)習(xí)嵌入式工程師經(jīng)驗(yàn)分享的資料分享給大家,文檔上從、嵌入式系統(tǒng)的概
    發(fā)表于 10-21 11:07 ?47次下載
    <b class='flag-5'>嵌入式開發(fā)</b>資料免費(fèi)分享

    嵌入式開發(fā)putty串口打印亂碼

    目錄嵌入式開發(fā)putty串口打印亂碼編碼格式問題波特率設(shè)置錯(cuò)誤嵌入式開發(fā)putty串口打印亂碼在使用putty連接串口打印的時(shí)候,發(fā)現(xiàn)打印亂
    發(fā)表于 11-02 18:21 ?12次下載
    <b class='flag-5'>嵌入式開發(fā)</b>putty<b class='flag-5'>串口</b>打印亂碼

    嵌入式開發(fā)(一):嵌入式開發(fā)新手入門(轉(zhuǎn)載后續(xù)需要修改補(bǔ)充)

    嵌入式開發(fā)環(huán)境及交叉編譯環(huán)境,開發(fā)完成后,編譯得到bin文件,然后在Windows下將bin文件通過串口或網(wǎng)絡(luò)下發(fā)到嵌入式板卡,程序在嵌入式
    發(fā)表于 11-02 20:06 ?17次下載
    <b class='flag-5'>嵌入式開發(fā)</b>(一):<b class='flag-5'>嵌入式開發(fā)</b>新手入門(轉(zhuǎn)載后續(xù)需要修改補(bǔ)充)

    python做嵌入式開發(fā)_Python和嵌入式的區(qū)別是什么?可以做嵌入式開發(fā)嗎?

    從概念上來說,嵌入式和Python的區(qū)別還是比較明顯的,嵌入式是一個(gè)開發(fā)領(lǐng)域,而Python則是一門編程語言。下面就來和大家說一說嵌入式和Python這兩個(gè)之間的區(qū)別。
    發(fā)表于 11-02 20:21 ?14次下載
    python做<b class='flag-5'>嵌入式開發(fā)</b>_Python和<b class='flag-5'>嵌入式</b>的區(qū)別是什么?可以做<b class='flag-5'>嵌入式開發(fā)</b>嗎?

    MicroPython 在嵌入式開發(fā)的興起

    MicroPython 在嵌入式開發(fā)的興起
    的頭像 發(fā)表于 01-04 11:17 ?1879次閱讀

    STM32嵌入式開發(fā)的RTOS,你用過哪些?

    STM32嵌入式開發(fā)的RTOS,你用過哪些?
    的頭像 發(fā)表于 09-18 16:21 ?2172次閱讀
    STM32<b class='flag-5'>嵌入式開發(fā)</b><b class='flag-5'>中</b>的RTOS,你用過哪些?

    Linux系統(tǒng)的嵌入式開發(fā)是什么

    嵌入式開發(fā)聽起來很高大上,但其實(shí)它就在我們身邊。   嵌入式開發(fā)是指將操作系統(tǒng)、應(yīng)用程序或數(shù)據(jù)存儲(chǔ)在嵌入式設(shè)備,如手機(jī)、平板電腦、智能家居等。   隨著物聯(lián)網(wǎng)時(shí)代的到來,
    的頭像 發(fā)表于 10-12 15:40 ?1774次閱讀