起因和症状
我将 ESP8266 与 Arduino UNO 的软串口连接,搭配 AT 指令进行使用。但由于 Arduino 的软串口无法到达 115200 波特率的传输速度,于是我参考乐鑫的文档1,根据其对 UART 配置描述提供的指令样例,给 ESP8266 发送了如下指令:
1 | AT+UART_DEF=4800,8,1,0,3 |
紧接着,在 ESP8266 回复了一句 OK
后——ESP8266,完全沉默了。
在任何波特率,都无法获得 ESP8266 的响应。除了在 74880 波特率下能获得上电的系统日志信息。
问题梳理
在浏览了 Arduino 社区中遇到同样问题的相关讨论2,以及 StackOverflow3 中的相关问答后,我意识到,问题可能出在指令中最后一个参数上。
我重新翻阅了乐鑫的文档。文档中对 AT+UART_DEF
是这样描述的:
1 | AT+UART_DEF=<baudrate>,<databits>,<stopbits>,<parity>,<flow control> |
其中,<flow control>
为流控设置参数:
0:不使能流控
1:使能 RTS
2:使能 CTS
3:同时使能 RTS 和 CTS
文档关于这点也给出了相应的注意提示:
使用流控需要硬件支持流控:
MTCK 为 UART0 CTS;
MTDO 为 UART0 RTS
我使用的 ESP8266 是由安信可(Ai-Thinker)生产的 ESP-01S 模块。模块仅有的 8 个引脚中,没有 RTS 和 CTS 引脚。也就是说,在我设置了使能 RTS 和 CTS 进行流控后,在硬件上我却无法使用 RTS 和 CTS,所以 ESP8266 也就没有了响应。
解决方案
刷机 刷固件。
总结
ESP8266 不使能 CTS 和 RTS 流控,设置波特率可使用:
1 | AT+UART_DEF=9600,8,1,0,0 |
也可以使用:
1 | AT+CIOBAUD=9600 |
参考链接
[1] Espressif. ESP8266 Non-OS SDK AT 指令集
[2] Arduino Forum. I changed ESP8266 Baud rate to 9600 - Now No communication !!!
[3] StackOverflow. Set baud rate to esp8266 at 9600