rt-thread
rt-thread copied to clipboard
[Bug] [stm32][uart v2]DMA RX接收拆包问题
RT-Thread Version
master
Hardware Type/Architectures
STM32F407VGT6
Develop Toolchain
RT-Thread Studio
Describe the bug
- https://club.rt-thread.org/ask/question/083e070c010373b6.html
- 跟此链接描述一致;
- 配置如下
#define BSP_USING_UART3
#define BSP_UART3_RX_USING_DMA
#define BSP_UART3_TX_USING_DMA
#define BSP_UART3_RX_BUFSIZE 256
#define BSP_UART3_TX_BUFSIZE 256
- 复现步骤: 使用链接所示示例进行通讯;每次发送50字节,第3次发送时,拆包 https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/uart/uart_v2/uart?id=%e4%b8%b2%e5%8f%a3%e8%ae%be%e5%a4%87%e4%bd%bf%e7%94%a8%e7%a4%ba%e4%be%8b
- 原因:UART V2 DMA RX 开启了空闲中断+DMA全满半满中断; 前两次仅触发空闲中断;第三次触发半满中断后->执行了回调函数唤醒线程接收数据;但是此时数据并未接收完成,导致又进入了空闲中断重复步骤,再次唤醒线程接收数据;导致接收的数据拆包断帧;
- 观察同样原理实现的STM32自带的
HAL_UARTEx_ReceiveToIdle_DMA,并没有对DMA全满半满做出处理; - 所以同样,uartV2的DMA RX实现,也不应该对半满全满中断做处理;
- 之所以有做半满全满中断的处理;我认为是从uartV1借鉴过来的;uartV1没有开启空闲中断,是自行在半满全满执行数据拷贝;开启空闲中断后,不需要执行这两个步骤;
- 解决方法 方法1:注释掉uartV2的全满半满处理逻辑 方法2:uartV2按照uartV1实现的DMA方式实现
Other additional context
No response