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

这篇具有很好参考价值的文章主要介绍了STM32使用HAL库,串口收发一段时间后出错问题及解决。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题及解决方法

当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函数中,开始处进行了上锁hal库串口中断接收数据异常,STM32入门到精通(嵌入式开发基础),stm32,单片机,嵌入式硬件
虽然最后在UART_Start_Receive_IT中进行了解锁,hal库串口中断接收数据异常,STM32入门到精通(嵌入式开发基础),stm32,单片机,嵌入式硬件
但有多种情况会导致不能解锁,从而影响到了串口接收。
在使用HAL_UART_Transmit时,可以看到,此函数的源码中,也有上锁和解锁,而且还是和UART_Start_Receive_IT控制的是一个锁!!!好好的全双工被HAL库搞成了半双工。

解决办法

手动解锁文章来源地址https://www.toymoban.com/news/detail-601521.html

	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);
		}
	}

到了这里,关于STM32使用HAL库,串口收发一段时间后出错问题及解决的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【STM32通讯系列--串口通讯】使用标准库、HAL库实现任意长度数据的收发(包含帧头、帧尾校验,配套完整开源程序)

    【数据组成】串口的通讯协议由开始位,数据位,校验位,结束位构成。 【数据结构】一般以一个低电平作为一帧数据的起始,接着跟随 8 位或者 9 位数据位,之后为校验位,分为奇校验,偶校验和无校验,最后以一个先高后低的脉冲表示结束位,长度可以设置为 0.5,1,

    2024年02月14日
    浏览(43)
  • 在STM32中使用5个串口收发数据的问题

    之前碰巧有个项目需要多个串口,用的是ST自带的5个串口没有用扩展芯片 1.MCU型号:STM32F103VET6 2.标准库 1.5个中断同时开启接收数据,即使设置了优先级,还是会出现卡死现象 2.5个中断开启时,printf 重定义如何兼容5个串口 3.如何将5个串口实现通用配置,兼容STF10XXX系列 4.在单片机中

    2024年02月21日
    浏览(41)
  • HAL库STM32CUBEMX学习记录(一)——USART(串口中断收发数据)

    一、首先使用STM32CUBEMX新建一个工程 二、打开工程文件 1.在usart.c中添加以下代码  2.然后在最后面加入中断回调函数 3.在usart.h文件中加入  4.新建一个cmd.c文件,创建命令check函数 5.在mian函数中的while(1)循环中调用USART1_Check(USART_RX_BUF)函数 6.最后串口初始化函数后打开串口中

    2024年02月16日
    浏览(42)
  • 入门stm32:STM32hal库实现ESP8266与手机通信(不定长数据收发和ESP8266使用的一些问题)

    目录 前言 一、stm32cubeMX的串口配置 二、空闲中断+dma接收 三、ESP8266.c和ESP8266.h ESP8266.h ESP8266.c 注意事项 四、与手机通信例程 步骤:  例程代码main.c 运行结果 五、相关问题 总结 相关的app和源码         前提: 1.掌握串口通信和ESP8266的使用方法 串口通信:单片机串口通信

    2024年02月04日
    浏览(84)
  • 入门小白:STM32hal库实现ESP8266与手机通信(不定长数据收发和ESP8266使用的一些问题)

    目录 前言 一、stm32cubeMX的串口配置 二、空闲中断+dma接收 三、ESP8266.c和ESP8266.h ESP8266.h ESP8266.c 注意事项 四、与手机通信例程 步骤:  例程代码main.c 运行结果 五、相关问题 总结 相关的app和源码         前提: 1.掌握串口通信和ESP8266的使用方法 串口通信:单片机串口通信

    2024年02月07日
    浏览(60)
  • 【STM32笔记】HAL库低功耗STOP停止模式的串口唤醒(解决进入以后立马唤醒、串口唤醒和回调无法一起使用、接收数据不全的问题)

    【STM32】HAL库低功耗STOP停止模式的串口唤醒(解决进入以后立马唤醒、串口唤醒和回调无法一起使用、接收数据不全、首字节错误的问题) 【STM32笔记】低功耗模式配置及避坑汇总 前文: blog.csdn.net/weixin_53403301/article/details/128216064 【STM32笔记】HAL库低功耗模式配置(ADC唤醒无

    2024年02月14日
    浏览(36)
  • STM32 HAL 库 串口 函数HAL_UART_Transmit的BUG问题 及解决方法

    近期在开发图传项目的时候,由于需要发送的数据量及其庞大,因此在处理的时候, 发现STM32HAL库的串口函数,在处理海量数据的时候, 存在bug, 导致不能将指定数量的数据全部发送出去。  例如, 我以200个字节为一个数据包, 使用HAL_UART_Transmit函数,通过串口发送。 那么

    2024年02月13日
    浏览(34)
  • STM32 HAL库 STM32CubeMx -- 串口的使用(USART/UART)

    在上一篇博客里面写了串口通信的理论知识,在这一篇中将讲述串口通信在STM32CubeMx里面的配置,以及在函数里面怎么使用。 对于串口发送信息,分为三种方法: 串口阻塞方式收发 、 串口中断方式收发 、 串口DMA方式收发 。(DMA方式在之后的DMA章节讲解) 关于STM32CubeMx的基

    2024年02月06日
    浏览(68)
  • stm32(HAL库)使用printf函数打印到串口

    目录 1、简介 2.1 基础配置 2.1.1 SYS配置  2.1.2 RCC配置 2.2 串口外设配置  2.3 项目生成  3、KEIL端程序整合   4、效果测试 在HAL库中,常用的printf函数是无法使用的。本文通过重映射实现在HAL库中进行printf函数。 2.1.1 SYS配置  2.1.2 RCC配置 在usart.c函数最下方复制如下代码 接着在

    2024年02月14日
    浏览(41)
  • STM-32:串口收发数据包—串口收发HEX数据包/串口收发文本数据包

    1、包头包尾和数据载荷重复的问题,传输的数据本身是FF和FE,可能引起误判 解决:限制载荷数据的范围,限幅(例如只发送0~100) 如果无法避免数据与包头包尾重复,则尽量使用固定长度的数据包 增加包头包尾的数量,尽量是其呈现出载荷数据出现不了的状态 2、包头包尾并

    2024年02月03日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包