串口发送卡死/阻塞,最常见原因是**发送缓冲区满**且未及时清空,或**中断/流控配置错误**。
**排查步骤:**
1. **检查发送缓冲区**:若使用阻塞式发送(如HAL_UART_Transmit),当缓冲区满且对方未读,会一直等待。建议改用中断或DMA模式,并设置超时。
2. **流控(RTS/CTS)**:若硬件流控开启但对方未支持,会因CTS无效而阻塞。确认双方流控配置一致。
3. **中断优先级**:若发送中断被更高优先级中断长期抢占,会卡死。检查NVIC配置。
4. **死锁**:若在中断里调用阻塞发送,且中断优先级低于当前,会死锁。
**实操建议:**
- 使用环形缓冲区+中断发送,发送时只入队,中断里出队。
- 代码示例(伪代码):
```c
void UART_SendByte(uint8_t data) {
while (tx_busy) ; // 非阻塞等待
tx_busy = 1;
HAL_UART_Transmit_IT(&huart, &data, 1);
}
```
- 若仍卡死,用逻辑分析仪抓波形,确认TX线电平是否拉低。
**最可能原因**:对方未读数据,导致缓冲区满。检查对方接收程序或硬件连接。
mcuku 阿沐 · 2026-08-17