关于ESP8266稳定性问题及规避方法
问题:
ESP8266(固件v0.9.5.0 AT Firmware)如果操作不慎,长时间运行会经常出现复位或者卡死现象,卡死时对任何AT命令只回应“busy p...",包括复位命令:
AT+CIPMODE=0
busy p...
AT+RST
busy p...
AT+RST
busy p...
此状态下只能通过复位ESP8266恢复。
另ESP8266在IP报文收发时容易出现复位现象,需要确保串口响应了上一条命令后再发送下一条命令。
规避方法:
1、增加AT命令发送函数,确保串口响应了上一条命令后再发送下一条命令
arduino函数:
/**
* 执行一个AT命令,等待OK或ready再返回,或者超时返回
*/
String execATCommand(String cmd, int timeout, boolean norst){
//执行AT命令前,先把缓存内的数据都读完,防止影响命令结果
if(1){
while( Serial.available() > 0) {
Serial.read();
}
}
Serial.print(cmd);
Serial.print("\r\n");
String data = "";
if(timeout > 0){
long t1 = millis();
do{
char r = Serial.read();
if(r < 0){
continue;
}
if(r == '\n' || r == '\r') {
data="";
} else {
data += r;
}
if(norst)
{
if(data == "OK")
return data;
}
else
{
//复位命令时返回ready为成功
if(data == "ready")
return data;
}
}while((millis() - t1) < timeout);
}
data="ERR";
return data;
}
2、增加死机检测,死机时硬件复位
arduino发送串口AT命令给ESP8266,如果连续几次没有得到正确返回(超时返回),就通过数字管脚对ESP8266进行复位。如ESP8266-01的复位脚通过电阻分压(5V转3.3)接arduino D8引脚:
//ESP8266复位管脚
#define ESP_RESET_PIN 8
//ESP8266复位函数
void ESP_Reset()
{
digitalWrite(ESP_RESET_PIN, LOW);
delay(1000);
digitalWrite(ESP_RESET_PIN, HIGH);
delay(1000);
}
//判断语句
...
cmd = "AT+CIPMODE=1";
respMessage = execATCommand(cmd, 5000, true);
if(respMessage=="ERR")
{
//判断ESP8266是否死机,连续3次以上无正确响应即复位
ESP_ErrNum++;
if(ESP_ErrNum>3)
{
ESP_Reset();
ESP_ErrNum=0;
}
return;
}
else
{
ESP_ErrNum=0;
}
...
参考:
玩转ESP8266测试板(一):基本操作
玩转ESP8266测试板(二):程序烧写
玩转ESP8266测试板(三):远程控制测试板
玩转ESP8266测试板(四):SDK编程
关于ESP8266稳定性问题及规避方法
发表评论