STM32F4的HAL库串口HAL_UART_Receive()轮询接收多个数据

本文探讨了在ST串口开发中,如何从传统的RXNE中断接收方式转向使用查询式接收函数,以提高资源效率。作者分享了遇到的调试挑战,如寄存器操作干扰、信号监测问题,以及解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ST的串口接收没有硬件FIFO,我一直使用的是接收非空中断(RXNE)中单字节读取的方式进行数据接收。用此方式进行数据接收会导致每一个字节都要进入中断处理,感觉上比较浪费资源,但好处是可以接收任意字长的数据(255以内)。

本次项目开发ST作为串口通讯的主机,因为知道返回数据的格式,可以很好的处理通讯不定字长的情况,因此我想尝试换成查询接收的方式,函数使用正点原子的HAL库函数HAL_UART_Receive(&USART2_RS485Handler,tx_buf,len,1000);,测试成功。

                                          串口助手发送数据的截图

                                                                                                                                                           接收到数据的数组的截图

下面说下调试过程中遇到的坑。

1、只能接收到第一个字节的数据

采坑点:

1)在debug模式下监控了usart的寄存器,监控寄存器的操作会导致仿真器读取DR寄存器,读取之后DR寄存器清零并且SR寄存器的接收非空标志位RXNE清零,导致不能正确接收数据。

2)在主函数中设置全局变量,利用赋值的方式监控RXNE标志位,在把GET_FLAG标志位在Watch  1中监控。监控时根本监控不到该变量置1的的瞬间。原因是数据被清零太快,监控器捕捉不到。

3)把GET_FLAG标志位放在逻辑分析仪中进行监控,发现其也不能查看到信号的变化。原因猜测仍为数据清零太快,不能监测到。如果中间加入延时,是可以查看到变化的。

 

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值