hal库stm32串口接收不定长数据

参考博客:
https://blog.csdn.net/qq_41830158/article/details/121254705

按下面步骤修改实测可用
步骤:
在这里插入图片描述
添加串口接收所需变量
  打开uart.c文件,在文件顶部的USER CODE BEGIN 0下方添加下列变量

volatile uint8_t rx1_len = 0;  //接收一帧数据的长度
volatile uint8_t rec1_end_flag = 0; //一帧数据接收完成标志
uint8_t rx1_buffer[BUFFER_SIZE]={0};  //接收数据缓存数组

添加串口及IDLE处理函数
  打开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();}
}

声明变量及函数
  打开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);//串口发送封装
void Usart1_IDLE(void);

启用IDLE中断
  进入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();  //前往数据处理函数处理接收到的数据。
}		

修改中断文件stm32f1xx_it.c,在中断处理函数中添加Usart1_IDLE();

void USART1_IRQHandler(void)
{/* USER CODE BEGIN USART1_IRQn 0 */Usart1_IDLE();/* USER CODE END USART1_IRQn 0 */HAL_UART_IRQHandler(&huart1);/* USER CODE BEGIN USART1_IRQn 1 *//* USER CODE END USART1_IRQn 1 */
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/660218.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言第十五弹---操作符(上)

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 操作符 1、操作符的分类 2、二进制和进制转换 2.1、2进制转10进制 2.1.1、10进制转2进制数字 2.2、2进制转8进制和16进制 2.2.2、2进制转16进制 3. 原码、反…

C++完成使用map Update数据 二进制数据

1、在LXMysql.h和LXMysql.cpp分别定义和编写关于pin语句的代码 //获取更新数据的sql语句 where语句中用户要包含where 更新std::string GetUpdatesql(XDATA kv, std::string table, std::string where); std::string LXMysql::GetUpdatesql(XDATA kv, std::string table, std…

智能小车案例:基于Raspberry Pi的自动巡航与避障系统

项目背景 随着物联网技术的不断发展,智能小车成为了现代生活和工业自动化中的重要工具。为了实现智能小车的自动巡航与避障功能,我们采用了Raspberry Pi作为主控制器,结合传感器和执行器,构建了一个完整的系统。 所需材料 Raspber…

幻兽帕鲁:10秒开服,一键配置游戏参数教程!

随着游戏行业的不断发展,玩家们对于游戏体验的要求也越来越高。为了满足玩家们的需求,腾讯云提供了游戏联机服务器一键部署方案,本文将为大家详细介绍如何基于腾讯云服务器10秒钟完成开服和配置游戏参数,让大家的游戏体验更加顺畅…

服装产业转型升级,iPayLinks帮助企业拓展市场盈更多

从十万件的大订单转变为几百件的小订单,小单快反模式为中国服装出口带来了机遇,也带来了挑战。 “十三行-中大-鹭江”是广州曾经最具代表性的外贸服装产业带。在过去很长的一段时间里,服装外贸老板在这里创造“神话”:24小时内完…

spdk技术原理简介和实践经验

一、导读 与机械硬盘相比,NVMe-ssd在性能、功耗和密度上都有巨大的优势,并且随着固态存储介质的高速发展,其价格也在大幅下降,这些优势使得NVMe-ssd在分布式存储中使用越来越广泛。由于NVMe-ssd的性能比传统磁盘介质高出很多&…

jvm基础篇之垃圾回收[1](方法区、堆回收)

文章目录 垃圾回收类型手动垃圾回收:C/C的内存管理自动垃圾回收:Java的内存管理自动垃圾回收应用场景不同垃圾回收对比 线程不共享部分的回收方法区的回收手动触发回收 堆回收两种判断方法引用计数法查看垃圾回收日志可达性分析法GC Root对象类型可达性算…

函数式接口当参数使用

如果函数式接口作为一个方法的参数,就以为着要方法调用方自己实现业务逻辑,常见的使用场景是一个业务整体逻辑是不相上下的,但是在某一个步骤有不同的逻辑,例如数据处理有不同的策略,如果有大量的if-els,或…

机器学习4-多元线性回归

多元线性回归(Multiple Linear Regression)是线性回归的一种扩展形式,用于建立因变量与多个自变量之间的关系。在简单线性回归中,我们考虑一个因变量和一个自变量之间的线性关系,而多元线性回归允许我们考虑多个自变量对因变量的影响。 一般…

轻松录制视频,WPS录屏功能全攻略

“有人知道wps怎么录屏吗?老师要求我们录制一段视频,是关于课堂教学的,可是我不会录制文档,眼看就快到提交的时间了,现在真的很着急,希望大家帮帮我!” 随着信息技术的发展,录制屏幕…

数字图像处理(实践篇)三十二 OpenCV-Python比较两张图片的差异

目录 一 方案 二 实践 ​通过计算两张图像像素值的均方误差(MSE)来比较两张图像。差异大的两张图片具有较大的均方差值,相反,相似的图片间则具有较小的均方差值。需要注意的是。待比较的两张图像要具有相同的高度、宽度和通道数。 一 方案 ①导入依赖库 import cv2 import…

ROR之.nil? .empty? .blank?的用法

1、出处 Ruby的方法:.nil?、.empty? Rails的方法:.blank? 2、意义: .nil? 判断对象是否存在; .empty? 对象已经存在,判断是否为空字段 .blank? 相当于同时满足.nil?和.empty? 注:Rails API中…

幻兽帕鲁专用服务器延迟高怎么解决?

幻兽帕鲁专用服务器延迟高的问题,可能是由于网络环境、服务器负载、数据传输等原因导致的。下面将针对这些问题,提供一些解决方案和建议,帮助您解决延迟高的问题,提升游戏体验。 1.检查网络环境。网络环境不稳定或者带宽较低&…

mysql navicat 定时执行sql脚本

1、查看数据库是否开启定时任务。 show variables like event_scheduler;2、没有开起的话,执行以下开启命令。 set global event_scheduler on;3、选择数据库,创建事件。 4、创建定义的执行函数或者存储过程。我自己写的是存储过程,如下。…

windows下postgresql的安装使用

一、安装 1、安装包安装 1.1 下载exe安装包 选择安装包:官网 或者点击下载:postgresql-12.12-1-windows-x64.exe Tip:此时若报错:There has been an error.An error occured executing the Microsoft VC runtime installer。 参…

阿里云 DMS 执行sql变更

数据库开发-数据变更-无锁变更 选择数据库:比如要更新生产库,搜索生产库名字。 填入变更sql。

V2X,启动高增长引擎

车载通讯的下一个新周期,毋庸置疑是V2X。从4G、5G再到C-V2X,是车载通讯逐步从信息娱乐、行车数据监控到万物互联的关键。 去年5月,全球车载通讯芯片巨头—高通公司宣布,与以色列车联网(V2X)芯片设计公司Aut…

10个关键字让你的谷歌竞价排名瞬间飙升-华媒舍

在现代社会中,搜索引擎已经成为获取信息的主要途径之一。在这其中,谷歌搜索引擎以其强大的搜索算法和智能化的用户体验而闻名。对于企业主来说,如何提高在谷歌搜索结果中的排名,对于他们的品牌推广和获取潜在客户非常重要。 1. 关…

pointer-events: none;解决页面水印导致子节点鼠标事件失效的问题

背景:实现水印功能之后,由于水印是一个遮罩层,导致z-index元素比较低的子元素,鼠标移入事件、点击事件都失效了。 解决方案:给添加水印样式的元素,添加css样式:pointer-events: none;。子元素添…