1. 程式人生 > >STM32 HAL庫學習系列第10篇---串列埠空閒中斷接收不定長資料

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

串列埠重定向配置:

可以直接複製使用

/*************************************************
  * 函式功能: 重定向c庫函式printf到DEBUG_USARTx
  * 輸入引數: 無
  * 返 回 值: 無
  * 說    明:無
  */
int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}

/**
  * 函式功能: 重定向c庫函式getchar,scanf到DEBUG_USARTx
  * 輸入引數: 無
  * 返 回 值: 無
  * 說    明:無
  */
int fgetc(FILE * f)
{
  uint8_t ch = 0;
  while(HAL_UART_Receive(&huart1,&ch, 1, 0xffff)!=HAL_OK);
  return ch;
}
/*****************************************************/

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

整體思路:

首先我在初始化的時候呼叫__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);打開了串列埠的接收中斷。注意這個時候我還沒有開啟空閒中斷。而是在接收到了一個byte以後開啟空閒中斷。

就這樣會一直接收資料一幀的其他資料,一幀接受完以後就會出現一個空閒的時間。這個時候空閒中斷就會發生。這時候我就把空閒中斷和接收中斷都關了。存在buf區的資料就是完整的一幀資料。

處理完一幀資料以後我再把串列埠中斷開啟重複上面的流程,就可以完整的接收一幀一幀的資料。同時利用空閒中斷也可以省去很多的的判斷。

空閒中斷到底是在什麼時候發生?我剛開始還理解錯了,以為一上電初始化的時候開啟空閒中斷,假如我沒有收到資料就會進入空閒中斷。實際上不是這樣的,空閒中斷是在收到資料之後再次出現空閒的時候就會觸發。所以在利用空閒中斷的時候不用擔心一上電就會觸發了他。不過我例程裡面是接收到資料以後才打開,這種情況也不用考慮了。

/*官方的中斷函式*/

voidUSART1_IRQHandler(void)

{

 /* USER CODE BEGIN USART1_IRQn 0 */

 /* USER CODE END USART1_IRQn 0 */

  HAL_UART_IRQHandler(&huart1);

 /* USER CODE BEGIN USART1_IRQn 1 */

 /* USER CODE END USART1_IRQn 1 */

}



/*改成自己的函式*/

voidUSART1_IRQHandler(void)

{

 /* USER CODE BEGIN USART1_IRQn 0 */

  user_Uart1Handler(); //新增自己的串列埠中斷處理函式

 /* USER CODE END USART1_IRQn 0 */

 /* USER CODE BEGIN USART1_IRQn 1 */

 /* USER CODE END USART1_IRQn 1 */

}



voiduser_Uart1Handler()

{

    if((__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE)!=RESET))

    {

            if(uart1RxState==UART_RX_STATE_READY)  //接收到一幀中的第一個位元組

            {

                   uart1RxState=UART_RX_STATE_START;

                  __HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);  //開啟空閒中斷

                  uart1RxCounter=0;                            //計數清零

                  uart1RxBuf[uart1RxCounter]=(uint8_t)(huart1.Instance->DR&(uint8_t)0x00FF);

                  uart1RxCounter++;

            }

            elseif(uart1RxState==UART_RX_STATE_START) 

            {

                  uart1RxBuf[uart1RxCounter]=(uint8_t)(huart1.Instance->DR&(uint8_t)0x00FF);

                  uart1RxCounter++;

            }

            __HAL_UART_CLEAR_FLAG(&huart1,UART_FLAG_RXNE);

         

    }

    if((__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)!=RESET)) //進入空閒中斷

    {         

          __HAL_UART_DISABLE_IT(&huart1,UART_IT_IDLE);   //關了空閒中斷

          __HAL_UART_DISABLE_IT(&huart1,UART_IT_RXNE);   //關了接收完成中斷

          uart1RxState=UART_RX_STATE_DEAL;               //狀態表明一幀資料接收完成了,需要處理。處理完以後再把接收中斷開啟

    }

}

除了這裡的改造外還需要在void HAL_UART_MspInit(UART_HandleTypeDef*uartHandle)這個函式裡面新增一句:開啟串列埠接收中斷的函式。

/* USER CODE BEGIN USART1_MspInit 1 */

  __HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);       

 /* USER CODE END USART1_MspInit 1 */

相關推薦

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

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

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

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

STM32 HAL學習系列3 常使用的幾種延時方式

1   自帶的hal_delay 函式    毫秒級延遲void HAL_Delay(__IO uint32_t Delay) { uint32_t tickstart = HAL_GetTick(

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

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

mysql學習10】:數據之索引與慢查詢優化

就會 長度 oldboy pty ODB myisam 做了 一次 復制代碼 mysql之索引原理與慢查詢優化 一、介紹 1.什麽是索引? 一般的應用系統,讀寫比例在10:1左右,而且插入操作和一般的更新操作很少出現性能問題,在生產環境中,我們遇到最

MySQL數據學習】增刪改查操作

自增id 命令 位置參數 modify 刪除一行 style 主鍵 客戶端 drop 註意:1.如果你在cmd中書命令的時候,輸入錯了就用\c跳出 2.\s查看配置信息 一、操作文件夾(庫) 增:create database db1 charset utf8;

MySQL數據學習】完整性約束

png 唯一約束 not null 會話 glob -- delet 初始 -a 一、介紹 約束條件與數據類型的寬度一樣,都是可選參數 作用:用於保證數據的完整性和一致性主要分為: PRIMARY KEY (PK) 標識該字段為該表的主鍵,可以唯一的標識記錄 FO

MySQL數據學習】單表查詢

not null for 比較運算符 創建 字符串 直接 過濾 field gpo 先創建表 #創建表 create table employee( id int not null unique auto_increment, name varchar(20) not

MySQL數據學習】索引原理與慢查詢優化

xxx 結構 復合 unix select查詢 全文搜索 等等 學習 獲取數據 一、介紹 1.什麽是索引? 一般的應用系統,讀寫比例在10:1左右,而且插入操作和一般的更新操作很少出現性能問題,在生產環境中,我們遇到最多的,也是最容易出問題的,還是一些復雜的查詢操作,因此對

MySQL數據學習】(視圖、觸發器、事物)

註意 onf action 聲明 concat_ws base 循環 5-0 print 一、視圖 視圖是一個虛擬表(非真實存在),其本質是【根據SQL語句獲取動態的數據集,並為其命名】,用戶使用時只需使用【名稱】即可獲取結果集,可以將該結果集當做表來使用。 使用視圖我們可

Spring Cloud學習系列【API網關服務】

proxy pack -c boolean 定制 能力 部分 線程 問題:   這篇隨筆接著學習微服務中一個比較重要的組件API網關服務。當我們微服務架構完成後最終是要提供給外部訪問的,於是我們需要一個統一的訪問入口,能隱藏我們內部服務URL細節,這就有點像局域網裏那個網關

STM32 HAL學習(五)RCC時鐘樹分析

開發板採用STM32F070RB,最大時鐘速率為48MHZ,在STM32Cube MX中可以選擇對應的晶片,得到它的時鐘樹如下所示: 分析時鐘樹,幾種主要的時鐘源分析如下 1、SYSCLK系統時鐘的時鐘源       &n

STM32 HAL學習(四) SPI查詢傳送與接收

又是花了兩天時間調SPI......細心細心還是需要細心啊,還是用的上次的SPI Flash晶片mx25l04600E,主要是測試晶片的初始化和讀取晶片ID是否成功。 STM32F070晶片只有一個SPI,但可用作SPI訊號管腳的引腳卻不只一組,建議通訊前先連線MOSI和MISO測試自發自收是否

STM32 HAL學習(三)ADC取樣以及printf的使用

ADC輸出的電壓值經轉換後一般為一個浮點數,要將其列印到串列埠則需要對串列埠輸出函式做一個調整。 首先是printf函式的重定向,將一下程式碼加入到usart.c中,完成後便可以用printf函式輸出字串到串列埠中,而要輸出浮點數,則還需在“專案/建立設定/C Linker/Miscellane

STM32 HAL學習(一) STM32CubeMX和TRUEStudio的使用

最近開始學習STM32的HAL庫,之前有用過std庫函式做STM32開發的基礎,因此學習HAL庫會更容易上手一些,但對於新的程式設計、下載工具以及HAL庫仍有許多不清晰的地方。經過初步的實驗實現點亮LED燈和串列埠的傳送資料之後,對所用到的幾個工具以及HAL庫進行一個總結。

Flask學習10】:自定義Form元件 自定義Form元件

自定義Form元件 一、wtforms原始碼流程 1、例項化流程分析 View Code 2、驗證流程分析

嵌入式C語言學習系列1---微控制器按鍵消抖操作

基本思想就是監測,延時,監測。。。,放進迴圈中可進行掃描式操作/**  * 函式功能: 讀取按鍵KEY1的狀態  * 輸入引數:無  * 返 回 值: KEY_DOWN:按鍵被按下;  *       

Mysql高手系列 - 10:常用的幾十個函式詳解,收藏慢慢看

這是Mysql系列第10篇。 環境:mysql5.7.25,cmd命令中進行演示。 MySQL 數值型函式 函式名稱 作 用 abs 求絕對值 sqrt 求二次方根 mod 求餘數 ceil 和 ceiling 兩個函式功能相同,都是返回不小於引數的最小整數,即向上取整 floo

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

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

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

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