NUCLEO-L073RZ与ESP8266通信异常:AT命令发送不全问题排查
UART OVERRUN ERROR 成因分析
问题场景
你使用NUCLEO-L073RZ通过UART1(PA9/PA10)与ESP8266通信,UART2用于和PC交互,同时用CP2102监听UART1的Tx信号。核心代码如下:
char *str2="UART2 start\r\n"; HAL_UART_Transmit(&huart2, (uint8_t *) str2, strlen(str2), 100); HAL_Delay(2000); str2="AT+CWJAP=\"mcserver\",\"m4mc1234\"\r\n"; HAL_UART_Transmit(&huart1, (uint8_t *) str2, strlen(str2), 100); HAL_Delay(9000); str2="AT+RST\r\n"; HAL_UART_Transmit(&huart1, (uint8_t *) str2, strlen(str2), 100);
实际现象:
- PC监听UART1 Tx输出仅显示:
AT+CWJAP="mcserver","m4mc1234" AT
第二条命令未完整发送,ESP8266也未完整接收第二条命令;断开ESP8266后,UART1 Tx能正常发送两条命令。
- 将
HAL_UART_Transmit的超时参数改为HAL_MAX_DELAY后代码正常运行,改为100000时仍无效,调试发现返回HAL_ERROR,原因是OVERRUN ERROR。
成因解析
1. ESP8266接收端处理阻塞,引发NUCLEO Tx缓冲区溢出
ESP8266执行AT+CWJAP命令时,内部正在执行WiFi连接的耗时操作(AP扫描、身份验证、IP获取等),此时它的UART接收模块优先级会被WiFi任务抢占,处于无法及时读取接收缓冲区数据的状态。NUCLEO的UART1在无流控的情况下持续发送数据,ESP8266未及时取走数据,导致NUCLEO的UART Tx硬件缓冲区被填满,后续数据无法写入,触发OVERRUN ERROR。
2. 缺失硬件流控,发送端无法感知接收端状态
当前连接未配置RTS/CTS硬件流控,NUCLEO无法实时获知ESP8266的接收能力。当ESP8266忙时,无法主动通知NUCLEO暂停发送,导致NUCLEO持续发送数据超出硬件缓冲区的处理极限。
- 改为
HAL_MAX_DELAY后正常,是因为该参数让HAL_UART_Transmit一直等待,直到ESP8266忙完恢复接收,发送流程才完成;而100000的超时值仍不足以覆盖ESP8266处理WiFi连接的耗时,因此仍触发错误。
3. 潜在的UART时序偏差(概率较低)
虽然第一条命令能正常交互,但ESP8266处理WiFi连接时,内部时钟或UART模块负载变化可能导致波特率出现细微偏差,进而影响接收端数据处理速度,间接引发发送端溢出。不过该概率极低,因为断开ESP8266后NUCLEO能正常发送,说明其UART配置本身无问题。
内容的提问来源于stack exchange,提问作者vishnu m c
相关产品推荐
相关产品推荐

