ESP8266 Developer Zone The Official ESP8266 Forum 2017-05-03T15:04:27+08:00 https://bbs.espressif.com:443/feed.php?f=16&t=4227 2017-05-03T15:04:27+08:00 2017-05-03T15:04:27+08:00 https://bbs.espressif.com:443/viewtopic.php?t=4227&p=12751#p12751 <![CDATA[Re: Random “busy s…” freeze when trying to send message by button input]]> Statistics: Posted by Her Mary — Wed May 03, 2017 3:04 pm


]]>
2017-05-02T19:50:53+08:00 2017-05-02T19:50:53+08:00 https://bbs.espressif.com:443/viewtopic.php?t=4227&p=12732#p12732 <![CDATA[Random “busy s…” freeze when trying to send message by button input]]>
What am I doing wrong?

This is my code:

Code:

//some variables like ssid, gateway,...

#include <SoftwareSerial.h>

SoftwareSerial esp8266(txPin, rxPin);

boolean allowedToSendMessage = true;
int buttonState = LOW;

void setup() {
  pinMode(buttonPin, INPUT);

  Serial.begin(9600);
  while (!Serial) {
    ;
  }

  Serial.println("Started");

  esp8266.begin(9600);
  delay(1000);

  sendToESP8266AndWaitForOk("AT+CWQAP");
  Serial.println("Wifi Disconnected!");

  sendToESP8266AndWaitForOk("AT+CWJAP=\""+ssid+"\",\""+password+"\"");
  Serial.println("Connected!");

  sendToESP8266AndWaitForOk("AT+CIPSTA=\""+ip+"\",\""+gateway+"\",\""+subnet+"\"");
  Serial.println("Static IP set!");

  sendToESP8266AndWaitForOk("AT+CIPSTART=\"TCP\",\""+server+"\","+String(sendPort)+"");
  Serial.println("Connected to "+server+" port "+sendPort+"");

  Serial.println("SETUP DONE");
}

void loop() {
  buttonState = digitalRead(buttonPin);

  if (buttonState == HIGH){
    allowedToSendMessage = false;
    sendTcpMessageToServer(String(id));
    allowedToSendMessage = true;
  }
}

void sendTcpMessageToServer(String message){
  String tmp = "";
  boolean canInsertMessage = false;
  int messageLength = message.length();

  messageLength = messageLength + 2;
  message = "|" + message;
  message = message + "|";

  String sendMessage = "AT+CIPSEND=" + String(messageLength);
  sendMessage = sendMessage + "\r\n";

  esp8266.println(sendMessage);
  delay(100);
  sendToESP8266AndWaitForOk(message);
  Serial.println("Message sent!");
}

void sendToESP8266AndWaitForOk(String message){
  String tmp;
  boolean ok = false;
  boolean error = false;
  boolean closed = false;
  boolean sendFail = false;
  boolean linkNotValid = false;

  Serial.println();
  Serial.println("##### SENDING " + message + "##### ");

  esp8266.println(message + "\r\n");

  if (tmp.length() > 0) Serial.println(tmp);

  while (!ok && !error && !closed && !sendFail && !linkNotValid){
    tmp = esp8266.readString();

    if (tmp.length() > 0) {
      Serial.println(tmp);
    }

    ok = tmp.indexOf("OK") > 0;
    error = tmp.indexOf("ERROR") > 0;
    closed = tmp.indexOf("CLOSED") > 0;
    sendFail = tmp.indexOf("SEND FAIL") > 0;
    linkNotValid = tmp.indexOf("link is not valid") > 0;
  }

  if (ok){
    Serial.println("OK RECEIVED FOR SENDING " + message);
  }
  else if (error){
    Serial.println("ERROR RECEIVED FOR SENDING " + message);
  }
  if (closed || linkNotValid){
    sendToESP8266AndWaitForOk("AT+CIPSTART=\"TCP\",\""+server+"\","+String(sendPort)+"");
    Serial.println("Connected to "+server+" port "+sendPort+"");
  }
  if (sendFail){
    sendTcpMessageToServer(message);
  }

  Serial.println("##### END OF " + message + "##### ");
  Serial.println();
}

Statistics: Posted by JohnD — Tue May 02, 2017 7:50 pm


]]>