rt-thread icon indicating copy to clipboard operation
rt-thread copied to clipboard

[Bug] [stm32][uart v2]DMA RX接收拆包问题

Open wdfk-prog opened this issue 1 year ago • 0 comments

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

wdfk-prog avatar Oct 15 '24 02:10 wdfk-prog