STM32使用HAL库,串口收发一段时间后出错问题及解决

news2024/11/23 20:56:44

STM32使用HAL库,串口收发一段时间后出错

  • 问题及解决方法
    • 问题1:串口溢出
    • 解决方法
    • 问题2:串口同时收发,一段时间后串口接收不工作
    • 解决办法

问题及解决方法

当STM32使用HAL库进行开发时,偶尔会遇到串口收发数据量大时,会出现问题。比如同时串口同时收发,一段时间后就只能发送,接收不工作。或是只接收,但数据量大时也不工作。下面对这些问题和其解决办法进行整理。

问题1:串口溢出

当数据量过大且传输频率快时,串口可能会因为溢出,而不进入串口中断。

解决方法

使能RXNE中断和ORE中断:

if(HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer,RXBUFFERSIZE)!-HAL_OK)
{
 __HAL_UART_ENABLE_IT(&huart1, UART_IT_ERR);
}

在usart.c中加入串口错误中断回调函数的定义

/* 中断错误处理函数,在此处理overrun错误 */
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
    uint8_t i = 0;

    if(__HAL_UART_GET_FLAG(huart,UART_FLAG_ORE) != RESET) 
    {
        __HAL_UART_CLEAR_OREFLAG(huart);
        HAL_UART_Receive_IT(huart,(u8 *)&i,1);
    }
}

问题2:串口同时收发,一段时间后串口接收不工作

明明STM32的串口通信是全双工的,但使用HAL库的STM32串口收发时发现,数据量大时,同时收发会出现问题。
问题的原因锁定在, STM32 HAL库在处理接收的时候会锁一下串口一会,导致变成某个短时间的“半双工”,这个时候如果同时收发就会出现问题。
HAL_UART_Receive_IT函数中,开始处进行了上锁
虽然最后在UART_Start_Receive_IT中进行了解锁,
但有多种情况会导致不能解锁,从而影响到了串口接收。
在使用HAL_UART_Transmit时,可以看到,此函数的源码中,也有上锁和解锁,而且还是和UART_Start_Receive_IT控制的是一个锁!!!好好的全双工被HAL库搞成了半双工。

解决办法

手动解锁

	return_state=HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer,RXBUFFERSIZE);
	if(return_state!=HAL_OK)
	{
		//解除忙状态(由ORE导致,清零ORE位)
		if(return_state == HAL_BUSY)
		{
			//清除ORE错误
//			__HAL_UART_CLEAR_OREFLAG(&huart1);//清楚ORE标志位
//			huart1.RxState=HAL_UART_STATE_READY;
			huart1.Lock=HAL_UNLOCKED;
			//重新开始接收
			return_state=HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer,RXBUFFERSIZE);
		}
	}

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

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

相关文章

开源创新 协同融合|2023 开放原子全球开源峰会开源协作平台分论坛即将启幕

由开放原子开源基金会主办,阿里云、CSDN 等单位共同承办的开源协作平台分论坛即将于 6 月 12 日上午在北京经开区北人亦创国际会展中心隆重召开。作为 2023 开放原子全球开源峰会的重要组成部分,开源协作平台分论坛将聚焦于开源代码平台的创新功能、用户…

[Halcon3D] 3D重要算子及简单处理点云模型求高度示例讲解

📢博客主页:https://loewen.blog.csdn.net📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢本文由 丶布布原创,首发于 CSDN,转载注明出处🙉📢现…

(转载)基于粒子群算法的PID控制器优化设计(matlab实现)

1 理论基础 PID控制器应用广泛,其一般形式为 可见,PID控制器的性能取决于Kp、Ki、Kd这3个参数是否合理,因此,优化PID控制器参数具有重要意义。目前,PID控制器参数主要是人工调整,这种方法不仅费时&#x…

PaaS平台iuap——数智底座支撑企业的全球化业务拓展

数智化转型是全球化企业非常关注的话题,数智化转型过程中suo 面临的问题与挑战也绝非一套简单的产品能够解决的,必须配合组织、人员、目标制度采用达成目标。iuap平台是整个企业数智化转型的底座,形象来说是我们的土壤,在这个土壤…

借助Aspose.BarCode,轻松实现QR和众多二维码在线扫描

Aspose.BarCode for .NET 是一个功能强大的API,可以从任意角度生成和识别多种图像类型的一维和二维条形码。开发人员可以轻松添加条形码生成和识别功能,以及在.NET应用程序中将生成的条形码导出为高质量的图像格式。 Aspose API支持流行文件格式处理&am…

postgresql多行转一列,再转多列

问题:某个单据明细表需要加上两列审批人 已有数据:单据表,审批记录表 实现: select billno ,split_part(string_agg(checkman,,),,,1) checkman1 ,split_part(string_agg(checkman,,),,,2) checkman2 from ods_workflownote GR…

指数对数计算公式基础知识

指数对数实际中也是比较重要的公式

浅谈智能配电系统在水务行业的应用

关注acrelzxz 摘要:在构建智慧水务和“双碳”时代背景下,智能配电系统在水务行业中发挥日益突出的重要作用。本文首先回顾了智能配电系统在水务行业的发展历程,并对其应用现状进行了分析,进而展望了智能配电系统在水务行业的发展…

不要再犯这些错误了!电脑使用误区大揭秘

本文是向大家介绍关于电脑的误区,电脑是较为贵重的一个电子产品,熟练掌握基本的电脑操作技巧应该是每一个人必备技能。在使用技巧之外,有一些误区是需要我们知道并避免的。 误区一:重装系统对电脑损耗极大 重装系统的损耗和玩游戏…

基于java语言编写的爬虫程序

Java语言可以使用Jsoup、HttpClient等库进行网络爬虫开发,其中Jsoup提供了HTML解析和DOM操作的功能,HttpClient则提供了HTTP协议的支持。你可以通过使用这些库,构建网络爬虫程序来爬取指定网站的数据。需要注意的是,应该遵守网站的…

chatgpt赋能python:Python函数未定义:如何解决?

Python函数未定义:如何解决? 在Python编程过程中,我们可能会遇到函数未定义的问题。这种错误会导致代码无法正常运行,对于开发者而言是非常头疼的问题。本文将介绍函数未定义的原因及解决方案,帮助您更好地解决这个问…

电脑文件怎么加密?文件设置密码保护的方法

在使用电脑的过程中,我们可能需要在计算机上保存各种文件,这其中就有十分重要的文件数据,而为了避免数据泄露事件的发生,我们需要使用合理的方法保护它们。文件加密就是最简单且有效的方法。那么电脑文件该怎么加密呢?…

Linux:LNMP的架构与环境配置

Linux:LNMP的架构与环境配置 一、安装 Nginx 服务1.1 安装依赖包1.2 创建运行用户1.3 编译安装1.4 优化路径1.5 添加 Nginx 系统服务 二、安装 MySQL 服务2.1安装Mysql环境依赖包2.2 创建运行用户2.3 编译安装2.4 修改mysql 配置文件2.5 更改mysql安装目录和配置文件…

VMware vCenter Server 8.0U1a 发布 - 集中式管理 vSphere 环境

VMware vCenter Server 8.0U1a 发布 - 集中式管理 vSphere 环境 请访问原文链接:https://sysin.org/blog/vmware-vcenter-8-u1/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org 2023-06-01, VMware vSphere 8.0U1a …

ZSTD 解压缩前端处理方案(干货简单)

如果可以实现记得点赞分享,谢谢老铁~ 1.需求描述 由于后台返回数据量大,请求资源比较耗时,需要一个方案来优化性能,下图是一个后台返回一个二进制的文件,需要解析成我们想要的对象 2.使用场景 采用ZSTD方案&#…

otter、canal跨服务器数据同步解决方案详解,包括下载、安装、配置、应用过程解读。

1.背景和原理: 阿里巴巴B2B公司,因为业务的特性,卖家主要集中在国内,买家主要集中在国外,所以衍生出了杭州和美国异地机房的需求,同时为了提升用户体验,整个机房的架构为双A,两边均可…

【数据结构】 队列 queque

一、什么是队列 单端队列:一端入队,一端出队 双端队列:两个口都可以进出 先进先出 二、常用操作 1.原理 访问 access:遍历查找某个元素 时间复杂度:O(N) 搜索 search:遍历查找某个元素 时间复杂度&a…

视频美颜sdk是什么?技术解析与实现原理详解

视频美颜技术的发展则为人们提供了一种美化自己的方式,因此,视频美颜技术成为了一个备受关注的领域。在这个领域中,视频美颜sdk技术则是实现高效美颜的关键因素之一。本文将从技术角度分析视频美颜sdk的实现原理和优势。 一、视频美颜技术的…

【十六】设计模式~~~行为型模式~~~策略模式(Java)

5.1. 模式动机 完成一项任务,往往可以有多种不同的方式,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务。在软件开发中也常常遇到类似的情况,实现某一个功能有多个途径,此时可以…

学编程能参加哪些比赛?

孩子学习编程可以参加这10个竞赛: 下面将会根据孩子所学的编程语言来列举孩子可以参加的竞赛: 一、Scratch编程可参加的比赛 1、全国中小学生电脑制作大赛 电脑制作大赛不能完全说是编程比赛,更多讲究艺术与科技结合。 评选项目要求学生使用计算机设计电子报、网页设计、F…