完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
问题:
我在项目中最初用的是HAL_UART_Receive_IT,HAL_UART_Transmit。每次在接收到数据后会在回调函数里再次调用HAL_UART_Receive_IT。 当高频进行串口数据收发时,发现有概率不能正常接收数据。 问题发生后断电重启后,又恢复正常。 根据各种调查外加查资料,发现主要原因应是 __HAL_LOCK 的直接返回,导致HAL_UART_Receive_IT 失败后不能再开中断。 STM32f103 HAL 库的 串口中断方式接收数据的函数HAL_UART_Receive_IT、发送函数 HAL_UART_Transmit_IT、HAL_UART_Transmit 的内部实现都有 __HAL_LOCK(huart); 根据其实现,若调用时发现已经上锁,则会直接返回 HAL_BUSY。 1.有人建议说使用 HAL_UART_Transmit_IT代替HAL_UART_Transmit,但是我看内部实现都有 __HAL_LOCK(huart),这样一来只是会减小上述问题发生的概率,并未解决问题,因此并未采用。 2.我尝试在原本HAL_UART_Receive_IT的地方都追加了返回值判断,一旦返回 HAL_BUSY,就去主循环每10ms重新调用一次 HAL_UART_Receive_IT,直到返回正确。 但是经过长时间测试,又发生了问题,无法接续正常收发数据了。 3.我尝试在 HAL_UART_Receive_IT的实现里,把__HAL_LOCK(huart) 注释掉,跟2.的设备一起做长时间测试,做对比试验,目前暂未出现问题。 但网上的开发者说并不建议这样粗暴对策,我也暂不明确会有什么副作用,因此目前还在寻找更好的方法。 请问大佬们是否有什么建议? 感激不尽。 |
|
相关推荐
1个回答
|
|
可能的原因包括:
1. 数据接收速度过快导致缓冲区溢出:如果接收数据的速度比处理数据的速度快,可能会导致缓冲区溢出,从而导致数据丢失。可以尝试增大接收缓冲区的大小或者更快地处理接收到的数据。 2. 中断优先级设置不正确:如果中断优先级设置不正确,可能会导致中断处理函数得不到正确的执行。确保串口接收和发送的中断优先级设置正确,且不会被其他高优先级中断打断。 3. 错误的时序问题:可能存在时序问题导致数据传输错误。可以尝试添加适当的延时或者调整时钟树以解决时序问题。 4. 电源干扰或传输线干扰:高频的串口数据传输可能会受到电源干扰或传输线干扰的影响,导致数据错误或丢失。可以尝试增强电源滤波和隔离串口传输线以减少干扰。 为了进一步确定具体问题的原因,可以使用调试工具(如串口调试助手)来查看发送和接收的数据是否正确,并使用示波器来观察相关的信号波形,以帮助定位问题。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1816 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1631 浏览 1 评论
1098 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
739 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1691 浏览 2 评论
1950浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
753浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
585浏览 3评论
604浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
568浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-29 21:35 , Processed in 0.718676 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号