1. 程式人生 > >STM32串列埠接收不定長資料原理與源程式

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

今天說一下STM32微控制器的接收不定長度位元組資料的方法。由於STM32微控制器帶IDLE中斷,所以利用這個中斷,可以接收不定長位元組的資料,由於STM32屬於ARM微控制器,所以這篇文章的方法也適合其他的ARM微控制器。
IDLE中斷什麼時候發生?
IDLE就是串列埠收到一幀資料後,發生的中斷。什麼是一幀資料呢?比如說給微控制器一次發來1個位元組,或者一次發來8個位元組,這些一次發來的資料,就稱為一幀資料,也可以叫做一包資料。
如何判斷一幀資料結束,就是我們今天討論的問題。因為很多專案中都要用到這個,因為只有接收到一幀資料以後,你才可以判斷這次收了幾個位元組和每個位元組的內容是否符合協議要求。
看了前面IDLE中斷的定義,你就會明白了,一幀資料結束後,就會產生IDLE中斷。這個中斷真是太TMD有用了。省去了好多判斷的麻煩。

如何配置好IDLE中斷?
下面我們就配置好串列埠IDLE中斷吧。
 
這是串列埠CR1暫存器,其中,對bit4寫1開啟IDLE中斷,對bit5寫1開啟接收資料中斷。(注意:不同系列的STM32,對應的暫存器位可能不同)
(RXNE中斷和IDLE中斷的區別?
當接收到1個位元組,就會產生RXNE中斷,當接收到一幀資料,就會產生IDLE中斷。比如給微控制器一次性發送了8個位元組,就會產生8次RXNE中斷,1次IDLE中斷。)
 
這是狀態暫存器,當串列埠接收到資料時,bit5就會自動變成1,當接收完一幀資料後,bit4就會變成1.
需要注意的是,在中斷函式裡面,需要把對應的位清0,否則會影響下一次資料的接收。比如RXNE接收資料中斷,只要把接收到的一個位元組讀出來,就會清除這個中斷。IDLE中斷,如何是F0系列的微控制器,需要用ICR暫存器來清除,如果是F1系列的微控制器,清除方法是“先讀SR暫存器,再讀DR暫存器”。(我怎麼知道?手冊上寫的)

下面以STM32F103為例給出源程式。
我們先來看程式中的主要部分。
串列埠初始化函式片段
 
如果你原來的串列埠初始化函式具有開啟串列埠接收中斷的話,實際上就是在初始化函式中多了一條開啟空閒中斷的語句。
串列埠中斷函式
 
串列埠中斷函式裡面,最重要的兩條語句,就是上圖中圈出來的兩條語句。第一條語句用來判斷是否接收到1個位元組,第二條語句用來判斷是否接收到1幀資料。(是不是感覺超級方便?媽媽再也不用擔心我如何判斷是否接收完1幀資料了。)
主函式
 
我寫的這個主函式,是用來驗證接收的正確性的。RxCounter表示的是這一幀資料有幾個位元組,接收完一幀資料,會在中斷函式裡面把ReceiveState置1,然後,通過串列埠把接收到的資料傳送回串列埠。這樣,既驗證了接收了多少位元組的正確性,又驗證了接收到的資料是否正確。

 

上圖是結果驗證。

/**
  ******************************************************************************
  * @file    串列埠接收不定長位元組資料
  * @author  瑞生
  * @version V1.0
  * @date    2015.10.23
  * @brief   Main program body
  ******************************************************************************
  ******************************************************************************
  */  


/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "uart.h"




volatile uint8_t aRxBuffer[100]={0x00};
volatile uint8_t RxCounter=0;
volatile uint8_t ReceiveState=0;
/**
  * @brief  Main program.
  * @param  None
  * @retval None
  */
int main(void)
{
        uint8_t i=0;
        
        USART1_Init();
        
  while (1)
  {
                if(ReceiveState==1)//如果接收到1幀資料
                {
                        ReceiveState=0;
                        i=0;


                        while(RxCounter--)// 把接收到資料傳送回串列埠
                        {
                                USART_SendData(USART1, aRxBuffer[i++]);        
                                while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
                        }
                        RxCounter=0;
                }
  }
}





相關推薦

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

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

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

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

STM32F030C8T6串列接收不定資料

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

stm32-串列接受不定資料方法(3種)

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

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

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

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

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

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

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

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

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

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

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

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

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

STM32接收不定資料

接受不定長資料的原理:建立一個數據緩衝的陣列,開啟接收中斷和串列埠空閒中斷,每一次接收則把資料存入快取區,當產生空閒中斷表示這一幀資料接受完成。 (1)構造緩衝 struct STRUCT_USARTx_Fram strUsart_Fram_Record = {0};#if

串列接收時丟資料問題解決方案

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

STM32串列接收字串並控制LED

串列埠相關配置 GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Peri

串列接收一幀資料及解析

3. 下位機中的資料接收和協議解析    下位機接收資料也有兩種方式,一、等待接收,處理器一直查詢串列埠狀態,來判斷是否接收到資料。二、中斷接收。兩種方法的優缺點在此前的一篇關於串列埠通訊的文章中詳細討論過。得出的結論是採用中斷接收的方法比較好。    資料包的解析過程可以設定到不同的位置。如果協議比較簡單,

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

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

HAL庫關於串列接收中斷接收不定字元實現

1、IO口基本配置:     GPIO_InitStruct.Pin = CTR_UART4_TX;   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; //  GPIO_InitStruct.Pull = GPIO_NOPULL;   GP

STM32串列傳送資料接收資料方式總結

       之前寫了篇關於ESP8266使用AT指令進行互相通訊的實驗,在寫STM32串列埠接發資料的程式中,覺得有必要將之前學的有關於串列埠方面的使用經歷加以總結。 串列埠傳送資料:        1. 串列埠傳送資料最直接的方式就是標準呼叫庫函式 。 void

STM32空閑中斷+DMA解決接收不定數據問題

sdl 接收 bbb gfs href dtb dsl target lwp d3蛹追儇j9司盟乓fb斬蔔範http://sjjcjdblt.wikidot.com/go檬譖棺o0節紗稚22南勸枚http://zszztb.wikidot.com/ft劣拭撾vp酪慚壬xa段

STM32串列通訊中使用printf傳送資料配置方法(開發環境 Keil RVMDK)

出處:STM32串列埠通訊中使用printf傳送資料配置方法(開發環境 Keil RVMDK) http://home.eeworld.com.cn/my/space-uid-338727-blogid-47176.html 在STM32串列埠通訊程式中使用printf傳送資料,非常的方便。

關於RS485通訊中使用STM32串列以DMA方式傳送資料丟失位元組的問題

1、開發平臺 計算機作業系統:WIN7 64位; 開發環境:Keil MDK 5.14; MCU:STM32F407ZET6; STM32F4xx韌體庫:STM32F4xx_DSP_StdPeriph_Lib_V1.4.0; 串列埠除錯助手; 2、問題描述  &