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

    文章

    7261

    浏览量

    92236
  • STM32
    +关注

    关注

    2295

    文章

    11034

    浏览量

    365958
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    STM32开发入门进阶必备!《STM32嵌入式系统开发—基于STM32CubeMX和HAL库》新书发布!

    近日,由华清远见教育科技集团精心编撰的教育部高等学校电子信息类专业教学指导委员会规划教材、普通高等教育电子信息类专业系列教材——《STM32嵌入式系统开发—基于STM32CubeMX和HAL库》重磅
    的头像 发表于 04-03 14:54 ?805次阅读
    <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生成的FreeRTOS源码格式如何优化?

    如图,STM32CubeMX生成的FreeRTOS源码格式有待优化,空格都是以箭头的方式呈现,观感很差。FreeRTOS官方下载的源码则不存在这个问题,说明是STM32CubeMX生成源码的过程出现的格式问题,希望ST官方能对此做下优化!
    发表于 03-10 08:04

    STM32CubeMX用于STM32配置和初始化C代码生成

    电子发烧友网站提供《STM32CubeMX用于STM32配置和初始化C代码生成.pdf》资料免费下载
    发表于 02-26 17:32 ?677次下载

    工程师开发利器:STM32CubeMX 与 eDesignSuite 的协同开发

    工程师开发利器推介:STM32CubeMX 与 eDesignSuite 的协同开发STM32CubeMX 和 eDesignSuite 的综合说明及其协同开发场景的分析:一、STM32CubeMX
    的头像 发表于 02-26 14:07 ?795次阅读
    工程师开发利器:<b class='flag-5'>STM32CubeMX</b> 与 eDesignSuite 的协同开发

    如何使用DMA进行USART不定长接收

    在上一讲中,我们对USART进行了简单介绍,并讲解了如何在不使用DMA的情况下进行不定长度数据接收,本讲将着重讲解如何使用DMA进行USART不定长接收
    的头像 发表于 02-18 17:01 ?963次阅读
    如何使用DMA进行USART<b class='flag-5'>不定长</b>度<b class='flag-5'>接收</b>

    使用stm32cubeMX无法生成mdk工程文件?

    几年前使用过cubemx,可以生成keil的工程文件。最近有个工程使用cubemx创建,结果只能生成stm32cubemx类型的文件,无法生成mdk的工程文件。 请教如何解决。 (我之前使用过多次
    发表于 01-04 20:03

    STM32CubeMX的菜单介绍

    相信初学者打开STM32CubeMX一定是一脸懵逼,里面都是全英文的,不知道从何入手。这里先给大家简单讲解一下。在新建工程这一栏里,我们最常用的是第一个,它会弹出一个芯片列表供你选择,然后就会创建一
    的头像 发表于 12-25 21:03 ?505次阅读
    <b class='flag-5'>STM32CubeMX</b>的菜单介绍

    【代码分享】基于乐鑫ESP32的串口不定长数据接收方法

    【代码分享】基于乐鑫ESP32的串口不定长数据接收方法
    的头像 发表于 11-15 01:02 ?1522次阅读
    【代码分享】基于乐鑫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为什么无法添加rt-thread-nano?

    STM32CubeMX 无法添加 rt-thread-nano
    发表于 09-27 06:17

    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 ?3616次阅读