关于STM32使用HAL_UART_Receive()无法接收数据的问题

这篇具有很好参考价值的文章主要介绍了关于STM32使用HAL_UART_Receive()无法接收数据的问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、问题发现

        在项目中我想通过阻塞的方式接收一段来自串口的数据,于是使用了HAL_UART_Receive函数,但跑起来发现一直超时接收不到。网上使劲搜但没搜到啥有用的结果,那只能自己捣鼓了。一开始怀疑是硬件的问题,于是用示波器直接连到对应的rx脚上,发现数据正常;于是我又尝试使用中断接收的方式,发现也能接收。那么,基本可以确定是HAL_UART_Receive这个函数本身有问题了。

关于STM32使用HAL_UART_Receive()无法接收数据的问题


 

二、问题追踪

        进入debug,并打开使用的USART的寄存器监视(我使用的USART1),发现RXEN一直都是0,ORE一直都是1(这两个都是ISR寄存器中的标志,关于USART的寄存器介绍,可看看这篇文章STM32单片机,UART的寄存器配置以及工作原理),也就是说,这个函数中没有清除ORE标志的动作,导致串口在收到第一个数据后,再没机会去接收第二个数据;这时候再看HAL_UART_Receive,不论在接受前,还是在接收循环体内,都没看到OREF的清除代码

关于STM32使用HAL_UART_Receive()无法接收数据的问题

循环接受中未看到OREF的清除


三、问题解决

        把USART的ISR(链接文章中为SR)寄存器看一下,再通过上面的解释,问题就可以解决了,只要在HAL_UART_Receive的循环体内添这么一句话

关于STM32使用HAL_UART_Receive()无法接收数据的问题

         现在终于可以正常阻塞接收了!

关于STM32使用HAL_UART_Receive()无法接收数据的问题

 

        最后,本着不动库函数的原则(防止cube重新生成后忘了修改),建议在某个地方重写这个函数并引用 。如果文章中有什么不对的地方,欢迎指正!文章来源地址https://www.toymoban.com/news/detail-510163.html

到了这里,关于关于STM32使用HAL_UART_Receive()无法接收数据的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • STM32学习笔记-SMT32使用HAL库UART中断方式使用

    目录 1、引言 2、配置 3、流程 近来需要使用蓝牙模块,再了解到蓝牙模块等无线模块许多使用串口透传,便决定在研究一下串口UART 的使用方法。 由于用的板子种类每次都不一样,有F103 有G0 有G4 还有公司的8位自研芯片,所以每次用起来都需要重头开始复习 每次使用UART的目

    2023年04月12日
    浏览(51)
  • STM32 HAL库的HAL_UART_Transmit_IT使用方法

    是STM32 HAL库中非阻塞的串口发送函数。 用法:1. 调用HAL_UART_Transmit_IT()发送数据            2. 在HAL_UART_TxCpltCallback()里写上发送完成后的处理 注意: HAL_UART_Transmit_IT()要等待上次发送完成后再发送,否则返回HAL_BUSY。用huart-gState == HAL_UART_STATE_READY判断上次是否发送完成。 官方

    2024年02月16日
    浏览(39)
  • stm32 hal库uart使用 DMA中断只能发送一次的问题

    1.stm32 uart使用DMA,无论发送还是接收都各自有一个数据流中断。这个数据流中断是框架代码不必过多关心。 2.使用了DMA后,uart的global中断是否要使用?标准做法是在cubemx上要勾选的,不然,就会产生只能发送一次的问题。 问题的原因? 我相信这是hal库的问题,理论上讲有一

    2024年02月11日
    浏览(43)
  • 关于STM32用DMA传输UART空闲中断中接收的数据时无法接收数据问题以及解决办法

             串口1相关的设置及printf函数的使用,这里没放,建议先实现串口打印功能 可以参考:使用STM32 CUBE IDE配置STM32F7 用DMA传输多通道ADC数据_stm32cubeide 配置adc_一只小白啊的博客-CSDN博客         普通模式和循环模式的区别在于,普通模式下,DMA只会接收一次数据,

    2024年02月05日
    浏览(61)
  • STM32 HAL库函数——HAL_UART_RxCpltCallback()详解

    HAL_UART_RxCpltCallback 是一个回调函数,用于在使用 HAL 库进行串口接收时处理接收完成事件。当使用 HAL_UART_Receive_IT 函数启动串口接收并且接收到指定数量的数据后,HAL 库会自动调用 HAL_UART_RxCpltCallback 函数。 回调函数是一种特殊的函数,它在特定事件发生时由系统或库调用,

    2024年02月13日
    浏览(38)
  • stm32 笔记 UART读取及HAL库应用

     由此图可知: 采用HAL库,中断方式接收串口,只有当RxXferCount == 0 时,也就是调用这个函数,接收指定量的数据大小完成时,才会调用回调函数HAL_UART_RxCpltCallback()。 而且,RxXferCount == 0 后,也会使得中断退出,此时需要从新设置 HAL_UART_Receive_IT() 开启中断。 这里还需要注意

    2024年02月15日
    浏览(49)
  • STM32 HAL库函数——HAL_UART_Transmit_IT()详解

    HAL_UART_Transmit_IT 函数的用法如下: 输入参数: huart :指向UART句柄结构体的指针,用于指定要使用的UART外设。 pData :指向要发送数据缓冲区的指针,可以是 uint8_t 类型或 uint16_t 类型的数据。 Size :要发送的数据大小,以数据元素( uint8_t 或 uint16_t )的数量表示。 返回值:

    2024年02月08日
    浏览(37)
  • STM32-UART-DMA HAL库缓冲收发

    1.1、注意事项: HAL库的DMA底层基本都会默认开启中断使能,如果在STM32CubeMx禁用了中断相关的功能,程序可能会进入空中断回调出不来。 切记使用STM32-HAL库的DMA发送时需要开启USART中断和DMA中断。 在一般时间要求不是很高很高的场合,使用HAL库自带的函数就可以,并不会很频

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

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

    2024年02月13日
    浏览(37)
  • 关于STM32使用HAL_Delay(),程序卡死,的解决办法。

    在使用STM32的Hal库开发时,存在在中断中使用Hal_Delay()时程序会卡死的问题,这是由于Hal_Delay()是使用定时器实现的,并且它的定时器中断优先级为15是最低的。需要给它重新设置中断优先级,实际操作方式如下: 这会把Hal_Delay()的优先级提到最高,同时要查看另一个中断优先

    2024年02月16日
    浏览(46)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包