国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

STM32CubeMX之串口接收不定長數據

撞上電子 ? 2023-05-11 09:59 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

基本串口通信通常只能接收到定長數據,無法穩定接收不定長數據,本章介紹利用STM32單片機的IDLE空閑中斷,接收不定長數據。

使能串口1的異步串行通信模式,開啟Usart1的全局中斷。添加DMA通道。b858f22c-ef9b-11ed-ba01-dac502259ad0.png

使用Stm32Cubemx生成源碼, 打開生成的源碼,刪除whiel循環中的語句。

打開usart.h文件,在文件開頭的USER CODE BEGIN Includes下方引入stdio.h頭文件b88d39ba-ef9b-11ed-ba01-dac502259ad0.png

打開usart.c文件,在USER CODE BEGIN 0與 USER CODE END 0之間添加下列代碼。

#if 1 struct __FILE { int handle; };
FILE __stdout; //定義_sys_exit()以避免使用半主機模式 void _sys_exit(int x) { x = x; } //重定義fputc函數int fputc(int ch, FILE *f){ while((USART1->SR&0X40)==0);//循環發送,直到發送完畢 USART1->DR=(uint8_t)ch; return ch;}#endif

打開uart.c文件,在文件頂部的USER CODE BEGIN 0下方添加下列變量。

volatile uint8_t rx1_len = 0; //接收一幀數據的長度volatile uint8_t rec1_end_flag = 0; //一幀數據接收完成標志uint8_trx1_buffer[BUFFER_SIZE]={0}; //接收數據緩存數組

打開uart.c文件,在文件末尾的USER CODE BEGIN 1下方添加下列函數。

void Usart1_IDLE(void) //USART1的IDLE接收{ uint32_t tmp_flag = 0; uint32_t temp; tmp_flag =__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE); //獲取IDLE標志位 if((tmp_flag != RESET))//idle標志被置位 { __HAL_UART_CLEAR_IDLEFLAG(&huart1);//清除標志位 HAL_UART_DMAStop(&huart1); // 停止DMA傳輸,防止 temp = __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);// 獲取DMA中未傳輸的數據個數 rx1_len = BUFFER_SIZE - temp; //總計數減去未傳輸的數據個數,得到已經接收的數據個數 rec1_end_flag = 1; // 接受完成標志位置1 }}
void Usart1_Handle() //USART1對接收的一幀數據進行處理{ DMA_Usart1_Send(rx1_buffer, rx1_len); //將接收到的數據回發給發送端 rx1_len = 0;//清除計數 rec1_end_flag = 0;//清除接收結束標志位 HAL_UART_Receive_DMA(&huart1,rx1_buffer,BUFFER_SIZE);//重新打開DMA接收}
void DMA_Usart1_Send(uint8_t *buf,uint8_t len) //串口發送封裝{ if(HAL_UART_Transmit_DMA(&huart1,buf,len)!= HAL_OK) //判斷是否發送正常,如果出現異常則進入異常中斷函數 { Error_Handler(); }}

b8b4cf48-ef9b-11ed-ba01-dac502259ad0.png

打開usart.h文件,在文件開頭的USER CODE BEGIN Includes下方添加如下語句:

#include "stdio.h"#include "string.h"#define BUFFER_SIZE 100
extern volatile uint8_t rx1_len; //接收一幀數據的長度extern volatile uint8_t rec1_end_flag; //一幀數據接收完成標志extern uint8_t rx1_buffer[BUFFER_SIZE]; //接收數據緩存數組
void Usart1_Handle(void);void DMA_Usart1_Send(uint8_t *buf,uint8_t len);//串口發送封裝voidUsart1_IDLE(void);

b8df94e4-ef9b-11ed-ba01-dac502259ad0.png

進入main.c文件,找到入口函數void mian(void), 在USER CODE BEGIN 2下方開啟串口1的DILE中斷,并打開DMA接收。

__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); //使能IDLE中斷 HAL_UART_Receive_DMA(&huart1,rx1_buffer,BUFFER_SIZE); //開啟DMA接收

在while語句中添加接收查詢語句。

if(rec1_end_flag) //判斷是否接收到1幀數據{ Usart1_Handle(); //前往數據處理函數處理接收到的數據。}

b8ff32fe-ef9b-11ed-ba01-dac502259ad0.png

打開stm32f4xx_it.c文件,在文件開頭引入usart.h頭文件。

b9383bee-ef9b-11ed-ba01-dac502259ad0.png

向下翻stm32f4xx_it.c文件,找到void USART1_IRQHandler(void)函數,此函數為串口1的中斷入口函數。在此函數中添加之前在usart.c文件中創建的IDLE接收函數。

b94cf58e-ef9b-11ed-ba01-dac502259ad0.png

源碼修改完畢后,編譯下載,打開串口助手,隨意發送100個字節以內的任意長度內容進入單片機,都可得到同樣的回復。

b9702af4-ef9b-11ed-ba01-dac502259ad0.png

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據
    +關注

    關注

    8

    文章

    7335

    瀏覽量

    94761
  • STM32
    +關注

    關注

    2309

    文章

    11162

    瀏覽量

    373430
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    串口空閑中斷與串口超時中斷介紹

    。 特點 依賴總線物理狀態,而非時間。 常用于檢測不定長數據幀的結束,無需依賴特定結束符。 應用場景 Modbus通信:不定長數據包的接收
    發表于 11-21 08:31

    請問RT-Thread與stm32cubemx聯合開發的原理是什么?

    在使用RT-Thread與stm32cubemx聯合開發的原理是什么,cubemx在其中主要起到了哪些功能呢?
    發表于 10-11 15:49

    意法半導體:STM32CubeMX將不再集成到STM32CubeIDE中

    從2025年11月發布的版本開始,我們將僅以 獨立 版本的形式提供 STM32CubeIDE 和 STM32CubeMXSTM32CubeMX將不再集成到STM32CubeIDE
    的頭像 發表于 09-01 17:18 ?3407次閱讀

    【RA4M2-SENSOR】—— 12.串口接收不定長度數據

    ;, U1_RxBuff);//打印收到的數據 user_uart_clear();//清空接收緩沖區 } HAL_Delay(10); } 編譯代碼,燒錄到板子 打開串口助手 發送
    發表于 09-01 11:22

    使用STM32CubeMX的時候創建的工程已經使用的板載資源如何去掉?

    在使用STM32CubeMX的時候創建的工程已經使用的板載資源如何去掉?在基于開發板進行工程創建的時候會把板載資源直接初始化,后面想要用不同的功能配置,如何把初始配置去掉?
    發表于 07-22 07:13

    STM32CubeMX配置STM32G070RBT6TR時為什么無法使能PVD中斷?

    STM32CubeMX 配置STM32G070RBT6TR時無法使能PVD中斷
    發表于 06-18 07:59

    【RA-Eco-RA4M2開發板評測】定時器輔助串口不定長數據接收

    assert(status==FSP_SUCCESS); } ??2.定時器輔助串口接收,實現不定長數據接收。定時器回調函數實現如下:
    發表于 04-30 14:44

    STM32開發入門進階必備!《STM32嵌入式系統開發—基于STM32CubeMX和HAL庫》新書發布!

    近日,由華清遠見教育科技集團精心編撰的教育部高等學校電子信息類專業教學指導委員會規劃教材、普通高等教育電子信息類專業系列教材——《STM32嵌入式系統開發—基于STM32CubeMX和HAL庫》重磅
    的頭像 發表于 04-03 14:54 ?1925次閱讀
    <b class='flag-5'>STM32</b>開發入門進階必備!《<b class='flag-5'>STM32</b>嵌入式系統開發—基于<b class='flag-5'>STM32CubeMX</b>和HAL庫》新書發布!

    請問STM32cubeMX中文版怎么設置?

    STM32cubeMX中文版怎么設置?
    發表于 03-13 06:12

    STM32CubeMX生成代碼就會覆蓋CMakeLists.txt文件,怎么解決?

    請教一下用STM32CubeMX生成代碼后,我自己加了一個頭文件和源文件,這些自己加的文件不是要配置到CMakeLists.txt編譯么,但下載在用STM32CubeMX生成成代碼,就會覆蓋CMakeLists.txt文件,這種一般怎么解決
    發表于 03-12 08:03

    STM32CubeMX無法打開.ioc文件怎么解決?

    我的STM32CubeMX不能打開別人的工程文件,雙擊打開.ioc文件后會全白,只剩左上角有個home,什么也點不了,但是我自己可以創建工程,也可以打開我自己創建的工程。請問我該如何解決
    發表于 03-12 07:39

    myST賬號無法注冊導致stm32cubemx無法下載hal庫的固件包,為什么?

    myST賬號無法注冊導致stm32cubemx無法下載hal庫的固件包,myST賬號注冊卡在最后的郵箱驗證環節,一直卡著無法注冊通過 很急很急!以前stm32cubemx都不需要登錄myST賬號就能下載固件包了,為什么現在搞個這種抽象東西出來?還不能注冊賬號
    發表于 03-11 06:17

    STM32CubeMX生成的FreeRTOS源碼格式如何優化?

    如圖,STM32CubeMX生成的FreeRTOS源碼格式有待優化,空格都是以箭頭的方式呈現,觀感很差。FreeRTOS官方下載的源碼則不存在這個問題,說明是STM32CubeMX生成源碼的過程出現的格式問題,希望ST官方能對此做下優化!
    發表于 03-10 08:04

    win7 64位系統STM32CubeMX安裝完成后數據包無法升級到最新版本,怎么解決?

    win7 64位系統 STM32CubeMX安裝完成后數據包無法安裝,安裝較低版本后又無法升級到最新版本,這個界面出現閃退,無法輸入用戶名和密碼,導致無法升級。也試過下載STM32Cube FW
    發表于 03-10 07:04

    使用STM32CubeMX生成CMake工程中的FLASH.ld被更改怎么解決?

    使用STM32CubeMX生成CMake工程之后,對STM32xxxx_FLASH.ld進行了修改。然后再次使用STM32CubeMX對工程進行修改的時候,STM32xxxx_FLAS
    發表于 03-10 06:52