在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    文章

    7018

    瀏覽量

    89013
  • STM32
    +關注

    關注

    2270

    文章

    10900

    瀏覽量

    355927
收藏 人收藏

    評論

    相關推薦

    STM32CubeMX的菜單介紹

    相信初學者打開STM32CubeMX一定是一臉懵逼,里面都是全英文的,不知道從何入手。這里先給大家簡單講解一下。在新建工程這一欄里,我們最常用的是第一個,它會彈出一個芯片列表供你選擇,然后就會創建一
    的頭像 發表于 12-25 21:03 ?60次閱讀
    <b class='flag-5'>STM32CubeMX</b>的菜單介紹

    【代碼分享】基于樂鑫ESP32的串口不定長數據接收方法

    【代碼分享】基于樂鑫ESP32的串口不定長數據接收方法
    的頭像 發表于 11-15 01:02 ?442次閱讀
    【代碼分享】基于樂鑫ESP32的<b class='flag-5'>串口</b><b class='flag-5'>不定長</b><b class='flag-5'>數據</b><b class='flag-5'>接收</b>方法

    【AG32開發板免費試用】+串口不定長收超時設置閾值多少合適?

    串口不定長收發超時設置閾值多少合適?這個和波特率有關系嗎? 考慮最大接收長度嗎?
    發表于 10-31 18:26

    STM32CUBEMX(8)--USART通過定時器中斷方式接收不定長數據

    概述 本文利用中斷實現串口不定長接收(非DMA),使用HAL庫,將接收數據打印出去。 DMA接收
    發表于 09-06 16:48

    STM32CUBEMX(6)--移植雅特力AT32F403AVGT7,雙串口通過DMA方式接收不定長數據

    每個外設都需要實現自己的本地數據存儲)相比,DMA解決方案在硅片成本和功耗方面的成本較低。 根據使用的產品型號的不同,有一個或兩個DMA模塊。 本篇文章主要介紹如何使用STM32CubeMX實現串口
    發表于 09-06 16:37

    STM32CUBEMX(2)--USART通過DMA方式接收不定長數據

    。 本篇文章主要介紹如何使用STM32CubeMX實現串口DMA讀取,并且打印出去。QQ群:615061293。 硬件準備 首先需要準備一個開發板,這里我準備的是NUCLEO-F030R8的開發板
    發表于 09-04 11:48

    stm32串口燒錄怎么設置

    準備工作 確保您擁有STM32開發板和相應的硬件設備,如USB轉串口模塊。 安裝STM32CubeMXSTM32CubeProgrammer軟件,這些是ST官方提供的工具,用于配置和
    的頭像 發表于 08-22 09:33 ?1495次閱讀

    基于STM32Cubemx創建FreeRTOS,創建UART任務遇到的兩個問題求解

    基于STM32Cubemx創建FreeRTOS,創建UART任務,經過測試發現有以下兩個問題: 1、串口波特率問題: 在STM32Cubemx串口設置如下: /* USART3 in
    發表于 05-10 07:33

    stm32f103通過UART_RX空閑中斷服務函數接收不定長數據,運行一段時間后會進入HardFault_Handler的原因?

    UART_RX_DMA接收。 問題:當不使用串口調試助手發送時,系統正常運行(長時間),通過串口調試助手發送不定長數據,剛開始正常運行,運
    發表于 04-26 06:43

    stm32cubemx串口中斷接收時,過一段時間串口中斷不進了怎么解決?

    我用stm32cubemx建的工程本來跑的挺好的,最近發現有bug。 我用uart1 在TIM3里邊 1s定時發送數據,采用問答式通訊,對端收到了之后發送8個字節的應答。問題是跑了幾十分鐘之后或者一
    發表于 04-17 06:48

    STM32F030CCT6調5個串口,UART2,3,5進不了接收中斷怎么解決?

    。UART2,UART3,UART5中斷發送正常,但是中斷接收有問題,有數據進來了,這3個口進不了中斷。怎么回事呢,有哪位碰到過。幫忙指教一下啊。 使用STM32CubeMX創建5個串口
    發表于 04-15 06:36

    STM32 DMA雙緩沖發送不定長數據怎么解決?

    STM32 DMA雙緩沖發送不定長數據,假如我需要發送100010個數據,開辟了2塊1000數據區,數據
    發表于 04-11 06:58

    STM32F030F4串口空閑中斷接收不定長數據,發生中斷后不知道如何計算接收到的字節數?

    我用STM32F030F4串口空閑中斷接收不定長數據,發生中斷后不知道怎樣計算接收到的字節數。
    發表于 04-03 07:12

    stm32f103如何實現spi從機接收不定長數據

    stm32f103 如何實現spi從機接收不定長數據數據首字節說明了數據長度) 求個思路或例程
    發表于 03-28 07:47

    STM32Cubemx配置USB虛擬串口,電腦無法識別怎么解決?

    STM32Cubemx配置USB虛擬串口,電腦無法識別問題?(上拉和驅動都配置好了)
    發表于 03-08 07:00
    主站蜘蛛池模板: 亚洲综合色在线| 天天天天做夜夜夜夜做| 天天操国产| 欧美精品aaa久久久影院| 亚洲一区区| 日韩一级欧美一级| 农村妇女色又黄一级毛片卡| 黄色自拍偷拍| 欧美色图28p| 免费观看做网站爱| 五月六月伊人狠狠丁香网| 黄色一级片视频| 国产色片| 国产精品偷伦费观看| 永久免费毛片| 韩国三级视频在线| 天天爽天天| 亚久久| 性欧美护士18xxxxhd视频| 三级色图| 网站一级片| 视频在线免费看| 久久国产美女免费观看精品| 五月激情电影| 最新版资源在线天堂| 久久久黄色片| 亚洲丁香| 狠狠五月婷婷| 日本黄色小说视频| 亚洲日本一区二区三区| 人与牲动交xx| 免费一级特黄视频| 清朝荒淫牲艳史在线播放| 麻豆国产三级在线观看| 天天干小说| 亚洲一区二区三区首页| 男女www视频在线看网站| 久久天天干| av福利网址网站| 欧美日韩国产成人高清视频| 萝控喷水视频|