主页 > 硬件 > 关于ESP8266稳定性问题及规避方法

关于ESP8266稳定性问题及规避方法

2016年5月21日 关于ESP8266稳定性问题及规避方法无评论 阅读: 28,565 次

问题:

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稳定性问题及规避方法

发表评论

新用户的评论需审核后才会显示;

电子邮件地址不会被公开;
必填项已用*标注