STM32
直播中

goodmbby

8年用户 1208经验值
擅长:处理器/DSP
私信 关注
[问答]

求助,调用HAL_UART_Transmit_DMA函数连续发送时发现发不出去是为什么?

我在调用HAL_UART_Transmit_DMA函数连续发送时发现发不出去(while(1)可以持续发送但可能丢了不少包),返回值为HAL_BUSY,条件即huart->gState == HAL_UART_STATE_READY不成立。在网上找解决方法都不能解决这个问题,比如在/* Set the UART DMA transfer complete callback */和/* Set the UART DMA Half transfer complete callback */中给 huart->gState赋值也不行。请问有什么好的解决方法?感觉也不像是数据还没发送完。

回帖(1)

神船大幅

2024-4-8 17:17:47
在使用DMA发送数据时,遇到返回值为HAL_BUSY的情况一般是由于DMA传输还未完成。下面给出几个可能的原因和解决方法:

1. 数据长度不正确:确保传输的数据长度为预期的长度,特别是当发送的数据不是固定长度的时候。

2. DMA传输未完全结束:DMA传输可能需要一定时间才能完成,确保在检查状态之前等待DMA传输完全结束。可以使用HAL_DMA_IRQHandler函数处理DMA传输中断,并在DMA完成传输后调用HAL_UART_DMAStop函数停止DMA传输。

3. DMA通道被其他外设占用:DMA通道可能被其他外设占用,导致HAL_BUSY状态。可以修改代码,使用其他未被占用的DMA通道。

4. DMA传输缓冲区溢出:DMA传输的缓冲区可能已满,导致不能继续发送数据。可以增加缓冲区的大小,或者修改代码以处理缓冲区溢出的情况。

5. 中断优先级设置不正确:确保UART和DMA相关的中断优先级正确设置,以确保中断能够正确处理。

6. 错误的硬件连接:确保UART和DMA的硬件连接正确,包括引脚连接和电源连接等。

如果以上方法都不能解决问题,建议参考芯片厂商提供的文档和示例代码,或者咨询厂商技术支持。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分