1. 程式人生 > >在MCU中,如何實現串列埠的不定長資料包接收?

在MCU中,如何實現串列埠的不定長資料包接收?

640?wx_fmt=jpeg

在MCU的應用中,經常需要通過串列埠進行不定長資料包的傳輸。傳送方很簡單,不需特別的考慮,而接收方則需要能夠偵測到資料包的結束。接收方的簡單做法是結合串列埠的IDLE中斷,或使用DMA並利用DMA的超時傳輸機制。

但有些MCU在設計時出於成本上的考慮,簡化了串列埠接收的IDLE模式以及DMA超時傳輸機制。沒有串列埠IDLE中斷或者DMA超時傳輸的機制,我們就不知道什麼時候通訊結束了。這種情況下,為了實現通過串列埠傳輸不定長資料包的要求,需要使用軟體和其它片內外設的配合,協同完成指定的功能。

LPC54101系列的UART模組,支援FIFO的接收超時,能夠方便地實現上述功能。除此之外,本文介紹一種基於LPC54101和SDK,通過使用引腳中斷和定時器配合,實現串列埠DMA接收超時,實現串列埠DMA接收超時的機制。

先分析下UART傳輸的時序,圖1是一個典型的8位資料位1位停止位的串列埠通訊資料流。串列埠每次傳送資料時會首先發送一個起始位,在TTL電平邏輯下,Start位首先是一個下降沿訊號。

640?wx_fmt=png

圖1. 串列埠接收資料時序圖

在串列埠DMA接收超時系統中,我們需要利用MCU的引腳中斷功能偵測這個下降沿訊號,引腳中斷觸發後告訴系統開始計時。要特別注意的是,當系統偵測到Start位的下降沿後最好關閉引腳中斷,不然後續資料流等訊號的下降沿也會觸發引腳中斷使得整套方案失去了意義(還不如直接用串列埠接收完成中斷)。

LPC54101的引腳中斷可以在任意IO引腳上使能,所以可以直接把LPC54101的串列埠接收的引腳的中斷功能開啟,並設定成下降沿觸發。

超時計數器最好是系統裡的低功耗定時器,這個例程中我們用的是LPC54101的RIT定時器。超時的時間設定要考慮到當前串列埠設定的波特率以及一次串列埠傳輸的最大包長。

超時定時器計數溢位產生中斷後,軟體首先要從DMA的狀態暫存器中獲取到當前接收到資料的長度(對於LPC54101來說,串列埠DMA接收資料的長度在XFERCFGn暫存器中的XFERCOUNT位,如圖2所示),然後從串列埠DMA預設定的資料緩衝區獲取對應的資料即可。

640?wx_fmt=png

圖2.  LPC54101 DMA傳輸資料長度計數位

在初始化設定串列埠對應的DMA通道時,最好設定傳輸長度為可能的最大長度,在接收超時後也別忘記重新復位一下串列埠對應DMA通道的狀態,不然本次接收的資料和資料長度還會帶入下次傳輸的過程中。

圖3是例程的流程圖,分主程式,串列埠RX引腳中斷服務程式,超時定時器服務程式三個部分。

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

圖3. 程式流程圖

本文的實現程式碼,已經貼在“NXP社群”的論壇中,點選此處檢視,歡迎在論壇中交流。

本文介紹的方法比較消耗片上資源,在資源不緊張的時候是個不錯的方案。

640?

免責宣告:本文系網路轉載,版權歸原作者所有。如涉及作品版權問題,請與我們聯絡,我們將根據您提供的版權證明材料確認版權並支付稿酬或者刪除內容。

相關推薦

MCU如何實現串列不定資料接收

在MCU的應用中,經常需要通過串列埠進行不定長資料包的傳輸。傳送方很簡單,不需特別的考慮,而接收

Ubuntu下安裝和使用lrzsz實現串列傳輸檔案&&minicom

一、安裝配置minicom 1、安裝minicom:sudo apt-get install minicom 2、配置minicom:sudo minicom -s ,        A.進入Serial port setup 選擇相應的埠和頻率。       (將選項A的

JQueryAjax實現對Map,List集合資料接收

jQuery中Ajax接收後臺Map、List集合資料實現過程 最近學習到jQuery實現非同步傳輸資料部分,雖然跟著視訊演練了常規json資料的接收,但個人感覺不太夠,現實應用中肯定不只是傳輸簡短以

STM32 HAL庫使用中斷實現串列接收不定資料

  以前用DMA實現接收不定長資料,DMA的方法接收串列埠助手的資料,全部沒問題,不過如果接收模組返回的資料,而這些資料如果包含回車換行的話就會停止接收,例如接收:AT\r\nOK\r\n,就只能接收到AT\r,導致沒有接收完成,具體原因還沒搞懂,有了解的,希望可以告知一下,DMA不定長接收方法傳輸門:htt

在HAL庫的基礎上修改串列中斷函式使串列中斷接收不定資料且不發生丟失現象。

        之前一直用STM32CUBE配置工程,但是一用到USART1的DMA接收中斷,或者USART1的接收中斷,就會出現問題,在之前的除錯中發現USART1的DMA與ADC1的DMA有衝突(原因我也不造啊),後來將USART1的DMA接收中斷改成USART1的接收中

RTOS_TINY實現串列傳送字串控制LED

題目內容 在RTOS_TINY作業系統下實現以下目標: 有四個LED,使用AT89S52的4個引腳驅動它們分別以5Hz,8Hz,20Hz,32Hz的頻率閃爍。設使用12MHz的晶振。用串列埠助手,通過傳送 “TURN on 1”,使得LED1持續閃爍,並回顯“LED1 on”;傳送

STM32開發小結--使用STM32F4串列的空閒中斷模式+DMA接收不定資料

開發平臺:Keil 5 庫函式版本:V3.5 晶片:STM32F407VET6 1 STM32的串列埠接收資料的方式 STM32的串列埠接收資料有三種方式可以選擇: 1.1 輪詢接收 在主迴圈中一直判斷串列埠接收完成標誌位是否置位,如果置位則讀取收到的資料。該種模式

STM32使用串列IDLE中斷的兩種接收不定資料的方式

現在有很多資料處理都要用到不定長資料,而微控制器串列埠的RXNE中斷一次只能接收一個位元組的資料,沒有緩衝區,無法接收一幀多個數據,現提供兩種利用串列埠IDLE空閒中斷的方式接收一幀資料,方法如下: 方法1:實現思路:採用STM32F103的串列埠1,並配置成空閒中斷IDLE模式且使能DMA接收

VC實現串列通訊的摸索過程

串列埠通訊對於需要進行嵌入式開發的小夥伴們來說是必不可少的,甚至說是無法迴避的。而VC卻又不像C#或者QT那樣人性化,沒有自帶串列埠類(貌似VC6時代還有一個串列埠控制元件可以下載然後通過安裝到VC6中),所以我們不得不到處尋找開源的串列埠通訊程式碼。 這裡我找到的是CSerialPor

如何實現串列程式等待字串"ar7240>"然後傳送一系列命令

VS2008WINFORM程式如何釋出到遠端站點VisualC#呼叫Fortran編寫的dll傳出陣列出錯VS2008WINFORM程式如何釋出到遠端站點VisualC#呼叫Fortran編寫的dll傳出陣列出錯 關於抽象工廠的解釋程式碼winform開發了一個建立域賬戶的程

在C#使用SerialPort類實現串列通訊

表1                                                      SerialPort類的常用屬性 名  稱 說  明 BaseStream 獲取 SerialPort 物件的基礎 Stream 物件 Ba

STM32 HAL庫學習系列第10篇---串列空閒中斷接收不定資料

串列埠重定向配置: 可以直接複製使用 /************************************************* * 函式功能: 重定向c庫函式printf到DEBUG

STM32串列接收不定資料原理與源程式

今天說一下STM32微控制器的接收不定長度位元組資料的方法。由於STM32微控制器帶IDLE中斷,所以利用這個中斷,可以接收不定長位元組的資料,由於STM32屬於ARM微控制器,所以這篇文章的方法也適合其他的ARM微控制器。IDLE中斷什麼時候發生?IDLE就是串列埠收到一

STM32F030C8T6串列接收不定資料

usart.c檔案程式碼。 #include "usart.h" #include "gpio.h" UART_HandleTypeDef huart1; /* USART1 init function */ void MX_USART1_UART_Ini

stm32-串列使用IDLE中斷接受不定資料方法

方法1:串列埠接受資料,定時器來判斷超時是否接受資料完成。 方法2:DMA接受+IDLE中斷 實現思路:採用STM32F103的串列埠1,並配置成空閒中斷IDLE模式且使能DMA接收,並同時設定接收緩衝區和初始化DMA。那麼初始化完成之後,當外部給單片機發送資料的時候,假設這幀資料長度是200個位元

用SPCOMM 在 Delphi實現串列通訊

SPCOMM 控制元件的屬性設定很關鍵的,特別是使用事件驅動時接收大塊資料時尤為明顯,如果設定不當,接收到的資料可能嚴重出錯。根據本人經驗,要注意事項如下:ReadIntervalTimeout:=100SPCOMM 屬性時,所有 可設定 True 和 False 的屬性應當設定成 False;在接收資料時,

樹莓派3B+ 安裝系統;搭建pythonopencv環境;實現串列通訊

一:安裝系統 二:通過VNC訪問樹莓派(無線和有線) 1.樹莓派設定 安裝vnc sudo apt-get update sudo apt-get install tightvncserver 設定vnc密碼(一定要設定,要不然無法

MFC利用MSComm控制元件實現串列通訊的例子

第一步:建工程 第二步:設定基本對話方塊 第三步:設定串列埠ID號 第四步:設定串列埠引數選項 第五步:設定其他控制元件ID號 第六步:新增串列埠控制元件 project->

STM32的串列空閒中斷接收不定資料

按照此文的方法實現了串列埠的收發,但是實際使用中發現: 接收空閒中斷的產生是在資料接收停止一個位元組時產生的,但是有時由於上位機編寫問題或硬體問題(本人用到的USB轉串列埠的硬體有問題)上位機發送資料不連續,中間有時間間隔大於一個位元組,從而造成無法完整接收資料。通過對

linux環境下C語言實現非阻塞方式讀取字串資料串列測試程式串列工具的編寫

一、前言 1.1 關於串列埠測試工具,網上已經有整合好的應用程式提供大家使用,但其只提供功能介面,內部具體怎麼實現的還需要自己去探索; 1.2 關於串列埠通訊的測試程式在網上已經是數見不鮮,但也不排除很多是直接“參考”別人的(ctrl+c),而且很多程式