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