# UART：DMA 模式下检测到溢出错误（ORE），数据丢失

- **ID:** `embedded/uart-overrun-error-dma-mode`
- **领域:** embedded
- **类别:** protocol_error
- **验证级别:** ai_generated
- **修复率:** 80%

## 根因

UART 溢出因 DMA 传输速率不足以在下个字节到达前清空接收缓冲区而发生。

## 版本兼容性

| 版本 | 状态 | 引入 | 弃用 |
|------|------|------|------|
| STM32Cube_FW_F4 V1.27.0 | active | — | — |
| HAL V1.8.0 | active | — | — |

## 解决方案

1. ```
   增加 DMA 缓冲区大小并使用循环模式以提供更多处理时间：`HAL_UART_Receive_DMA(&huart, buffer, BUFFER_SIZE);` 其中 BUFFER_SIZE >= 512。
   ```
2. ```
   使能 UART 硬件流控制（RTS/CTS）以限制发送端：设置 `huart.Init.HwFlowCtl = UART_HWCONTROL_RTS_CTS;`
   ```
3. ```
   降低 DMA 的中断优先级，提高 UART 全局中断优先级以更快处理 ORE 标志。
   ```

## 无效尝试

- **** — Increasing UART baud rate worsens overrun as data arrives faster. (85% 失败率)
- **** — Disabling DMA and using interrupt mode shifts bottleneck but does not fix root cause. (60% 失败率)
