STM32 多个串口同时跑是常规需求,核心是让每个串口独立工作,互不阻塞。推荐做法:
1. **使用中断或 DMA**:避免在主循环中轮询等待,否则一个串口繁忙会拖累其他串口。
2. **每个串口独立配置**:如 USART1、USART2 各自使能时钟、引脚、中断,中断服务函数分开。
3. **配合环形缓冲区**:接收中断里只存数据到缓冲区,主循环或任务中解析,发送可用中断或 DMA。
4. **注意中断优先级**:若串口波特率高或数据量大,可将中断优先级适当调高,但避免长时间占用 CPU。
5. **调试建议**:先单独测每个串口,再一起跑;用逻辑分析仪查看波形。
示例(HAL 库,使用中断接收):
```c
// 初始化两个串口
MX_USART1_UART_Init();
MX_USART2_UART_Init();
HAL_UART_Receive_IT(&huart1, &rx1_buf, 1);
HAL_UART_Receive_IT(&huart2, &rx2_buf, 1);
// 各自中断回调
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart == &huart1) {
// 处理 USART1 数据
HAL_UART_Receive_IT(&huart1, &rx1_buf, 1);
} else if (huart == &huart2) {
// 处理 USART2 数据
HAL_UART_Receive_IT(&huart2, &rx2_buf, 1);
}
}
```
如果数据量大,建议用 DMA + 空闲中断,降低 CPU 负载。注意中断服务函数里不要做耗时操作,保证实时性。
mcuku 阿沐 · 2026-08-14