cubemx stm32 配置两个串口_使用stm32CubeMX自动配置的工程文件,进行串口的不定长接收...

本文介绍了如何在STM32CubeMX配置的工程中实现串口不定长接收,避免频繁调用HAL_UART_Receive_IT函数降低效率。通过分析中断代码和启用RXNE中断,作者提供了自定义串口处理函数的方法,并分享了实际测试代码,确保即使在串口错误情况下仍能正常接收数据。
摘要由CSDN通过智能技术生成

方法描述:使用stm32CubeMX自动配置的工程文件,进行串口的不定长接收(非DMA方式)。

实际问题解决尝试:

1.HAL库函数只有接收定长数据HAL_UART_Receive()和HAL_UART_Receive_IT();函数声明如下:

f9d2b0dd0a288bb3bddfb0c6fc44ad15.png

通过查看论坛等找到的解决方式,一种是通过HAL_UART_Receive_IT(&huart1,(uint8_t *)buffer,1);来进入串口中断回调函数HAL_UART_RxCpltCallback();函数原型如下:

86a79d7bb5b7f650752b69626a21aa28.png

实际测试中,这种方式每次都需要去调用HAL_UART_Receive_IT函数,系统处理效率低。

2.通过审查生成的代码,如下所示: 首先是串口中断的代码,只有一条语句:

33628217cb0dfbe74185321bbcd56cdf.png

进行go to definition,可以看到接收中断会进入UART_Receive_IT这个函数。

710497ce79313ea8c1230c62b77918e8.png

继续往下级看,则可看到下图画线处所示,UART的RXNE中断使能被关闭了。

2f4f2ae3eeef8bed3e2347bb9879c152.png

所以,另一种解决方法是将这一句给屏蔽掉,HAL_UART_Receive_IT只需要执行一次就可以了,类似于打开RXNE中断的操作。但是,这种方法不好的地方在于,如果stm32cubeMX里重新配置并生成代码的话,这个地方的屏蔽会重新打开,也就是说每重新生成一次代码,cube工程不在用户操作区的改动都会被撤回。如果代码只是最终版本,这并无多大关系,如果后续还有其他的功能添加,则会很麻烦。

3.如果cubeMX配置的串口没有开启RXNE中断的话,那我们在初始化处添加试试:

经过测试,在经过初始化后,程序能够成功DEBUG进入串口中断函数,所以对串口中断里添加我们自己的处理函数即可,本人的处理代码是通过改编原子的串口代码而成,当然你也可以添加自己的处理算法,根据实际问题而定。这种方式即使重新生成工程,所做的处理也不会更改。

以下是本人实际测试代码:

ac736a81de814df3847fd4408c23cdfc.png

通过KEIL的DEBUG测试,通过此方法处理的程序,在运行到HAL_UART_IRQHandler函数中时,由于串口ORE位会置位为1, errorflags = (isrflags & (uint32_t)(USART_SR_PE | USART_SR_FE | USART_SR_ORE | USART_SR_NE));相应的不能够为RESET,则UART_Receive_IT函数并未能够进入,所以__HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);这句也就不能够被执行到。

下图为实际测试效果图:

219ffd851d80cf4e39de4a67aab57bbf.png

图中时间并不是正确时间,且由图可看出即使间隔10ms发一次数据,串口端都能够对数据进行准确接收方便程序处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值