串口发送卡死、阻塞是怎么回事?

嵌入式 · 3 浏览
串口发送卡死、阻塞是怎么回事?

回答(4)

建议在发送函数里加个超时变量,比如while循环计数,超时直接返回错误,避免死等。调试时很有用。
码农阿强 · 2026-08-17
补充:如果用了DMA,记得检查DMA中断和UART中断的优先级,有时DMA传输完成中断没触发,发送就卡在那。
嵌入式小张 · 2026-08-17
我遇到过是波特率不匹配,对方收不到,缓冲区一直满。先查波特率,再查流控,别一上来就改代码。
老电工老王 · 2026-08-17
串口发送卡死/阻塞,最常见原因是**发送缓冲区满**且未及时清空,或**中断/流控配置错误**。 **排查步骤:** 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

🧰 配套工具

🔗 波特率计算器