ESP8266 проблема с записью и чтением долговременной памяти

3d_killer
Offline
Зарегистрирован: 13.06.2018

Пробую добавить логин и пароль для подключения к точке доступа, а при попытке чтения там всякая ерунда хотя имя точки и пароль на английском и присутствуют цифры.

Запись и чтение с епрома делаю функциями

void writeString(char add,String data)
{
  int _size = data.length();
  int i;
  for(i=0;i<_size;i++)
  {
    EEPROM.write(add+i,data[i]);
  }
  EEPROM.write(add+_size,'\0');   //Add termination null character for String Data
  EEPROM.write(add+_size,0);   //Add termination null character for String Data
  EEPROM.commit();
}
 
 
String read_String(char add)
{
  int i;
  char data[50]; //Max 100 Bytes
  int len=0;
  unsigned char k;
  k=EEPROM.read(add);
  while(k != '\0' && len<50)   //Read until null character
  {    
    k=EEPROM.read(add+len);
    data[len]=k;
    len++;
  }
  data[len]='\0';
  return String(data);
}

Вот запись из вебинтерфейса:

//Запись в епром
String handleForm() 
  {
    if (server.method() == HTTP_POST) 
      {
        digitalWrite(led, 1);
        String message = "POST form was:\n";
        for (uint8_t i = 0; i < server.args(); i++) 
          {
            message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
            if(server.argName(i)=="ssid"){writeString(0, server.arg(i));}
            if(server.argName(i)=="ssid_password"){writeString(50, server.arg(i));}
            if(server.argName(i)=="email"){writeString(100, server.arg(i));}
            if(server.argName(i)=="password"){writeString(150, server.arg(i));}
          }
        return message;   
    }
  }

И чтение:

  ssid_my = read_String(0);
  ssid_password_my = read_String(50);
  email_my = read_String(100);
  password_my = read_String(150);

Далее вывожу в Serial

Serial.println(email_my);
Serial.println(password_my);
Serial.println(ssid_my);
Serial.println(ssid_password_my);

И получаю:

Ϥ⸮\⸮j⸮
 
 
NJF@<8⸮
 
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А скетч полностью можно? Записи и чтения. А то, много вопросов остаётся.

3d_killer
Offline
Зарегистрирован: 13.06.2018

Это когда запущен сервер, работает этот код:

const String postForms1 = "<html>\
  <head>\
    <title>Подключение Distiller к вашей сети</title>\
    <meta charset=\"utf-8\">\
    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no, shrink-to-fit=no\">\
    <style>\
      body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\
    </style>\
  </head>\
  <body>\
    <center><h1>Подключение к WI-FI</h1></center><br>\
    <form method=\"post\" enctype=\"application/x-www-form-urlencoded\" action=\"/postform1/\">\
      <table cellpadding=\"3\" width=\"100%\">\
        <tr>\
          <td>Имя сети</td>\
          <td><input type=\"text\" name=\"ssid\" value=\"\"></td>\
        </tr>\
        <tr>\
          <td>Пароль</td>\
          <td><input type=\"text\" name=\"ssid_password\" type=\"password\" value=\"\"></td>\
        </tr>\
        <tr>\
          <td><input type=\"submit\" value=\"Сохранить\">\</td>\
          <td></td>\
        </tr>\
      </table>\
    </form>\
  </body>\
</html>";
const String postForms2 = "<html>\
  <head>\
    <title>Подключение Distiller к серверу</title>\
    <meta charset=\"utf-8\">\
    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no, shrink-to-fit=no\">\
    <style>\
      body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\
    </style>\
  </head>\
  <body>\
    <center><h1>Подключение к серверу удаленного доступа</h1></center><br>\
    <form method=\"post\" enctype=\"application/x-www-form-urlencoded\" action=\"/postform2/\">\
      <table cellpadding=\"3\" width=\"100%\">\
        <tr>\
          <td>Email</td>\
          <td><input type=\"text\" name=\"email\" value=\"\"></td>\
        </tr>\
        <tr>\
          <td>Пароль</td>\
          <td><input type=\"text\" name=\"password\" type=\"password\" value=\"\"></td>\
        </tr>\
        <tr>\
          <td><input type=\"submit\" value=\"Сохранить\">\</td>\
          <td></td>\
        </tr>\
      </table>\
    </form>\
  </body>\
</html>";
const String postForms3 = "<html>\
  <head>\
    <title>Отчет</title>\
    <meta charset=\"utf-8\">\
    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no, shrink-to-fit=no\">\
    <style>\
      body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\
    </style>\
  </head>\
  <body>\
    <center><h3>Данные успешно приняты, отсоедените перемычку и перезагрузите устройство!</h3></center>\
  </body>\
</html>";
//Запись в епром
String handleForm() 
  {
    if (server.method() == HTTP_POST) 
      {
        digitalWrite(led, 1);
        String message = "POST form was:\n";
        for (uint8_t i = 0; i < server.args(); i++) 
          {
            message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
            if(server.argName(i)=="ssid"){writeString(0, server.arg(i));}
            if(server.argName(i)=="ssid_password"){writeString(50, server.arg(i));}
            if(server.argName(i)=="email"){writeString(100, server.arg(i));}
            if(server.argName(i)=="password"){writeString(150, server.arg(i));}
          }
        return message;   
    }
  }
void handleRoot1() 
  {
    digitalWrite(led, 1);
    server.send(200, "text/html", postForms1);
    digitalWrite(led, 0);
  }
void handleRoot2() 
  {
    digitalWrite(led, 1);
    //server.send(200, "text/html", postForms2+handleForm());
    server.send(200, "text/html", postForms2);
    digitalWrite(led, 0);
  }
void handleRoot3() 
  {
    digitalWrite(led, 1);
    //server.send(200, "text/html", postForms3+handleForm());
    server.send(200, "text/html", postForms3);
  }
void handlePlain() 
  {
    if (server.method() == HTTP_POST) 
      {
        digitalWrite(led, 1);
        server.send(200, "text/plain", "POST body was:\n" + server.arg("plain"));  
        digitalWrite(led, 0);
      }
  }
//Запуск сервера
void StartServer()
  {
      Serial.println();
      Serial.print("Configuring access point...");
      /* You can remove the password parameter if you want the AP to be open. */
      WiFi.softAP(ssid, password);
      IPAddress myIP = WiFi.softAPIP();
      Serial.print("AP IP address: ");
      Serial.println(myIP);
      server.begin();
      Serial.println("HTTP server started");
      //Проверяем что в eprom
      if (MDNS.begin("esp8266")){Serial.println("MDNS responder started");}
      //Если контакт не замкнут на массу то условие выполняется
      server.on("/", handleRoot1);
      server.on("/postform1/", handleRoot2);
      server.on("/postform2/", handleRoot3);  
      server.begin();
      Serial.println("HTTP server started");  
  }

Остальное к записи и чтению не относится (много кода с другими операциями связанного)

3d_killer
Offline
Зарегистрирован: 13.06.2018

еще раз загрузил скетч и оно заработало, может ошибка какая записи...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А где обещанная печать, о которой Вы говорили?

Serial.println(email_my);
Serial.println(password_my);
Serial.println(ssid_my);
Serial.println(ssid_password_my);

Её нет в этом коде. Более того, в нём вообще нет "read_String". В чём тогда его проблема?

3d_killer
Offline
Зарегистрирован: 13.06.2018

в первом же посте перед выводом, пропустили?

ssid_my = read_String(0);
ssid_password_my = read_String(50);
email_my = read_String(100);
password_my = read_String(150);

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Причём тут первый пост?

Я Вас попросил дать мне полный скетч, в котором видна проблема. Вы дали в #2. Но в #2 нет ни функции чтения, ни печати результатов.

В старых постах скетчи неполные и сказать ничего нельзя. например, ХЗ как у Вас переменные описаны.

3d_killer
Offline
Зарегистрирован: 13.06.2018
const String postForms1 = "<html>\
  <head>\
    <title>Подключение Distiller к вашей сети</title>\
    <meta charset=\"utf-8\">\
    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no, shrink-to-fit=no\">\
    <style>\
      body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\
    </style>\
  </head>\
  <body>\
    <center><h1>Подключение к WI-FI</h1></center><br>\
    <form method=\"post\" enctype=\"application/x-www-form-urlencoded\" action=\"/postform1/\">\
      <table cellpadding=\"3\" width=\"100%\">\
        <tr>\
          <td>Имя сети</td>\
          <td><input type=\"text\" name=\"ssid\" value=\"\"></td>\
        </tr>\
        <tr>\
          <td>Пароль</td>\
          <td><input type=\"text\" name=\"ssid_password\" type=\"password\" value=\"\"></td>\
        </tr>\
        <tr>\
          <td><input type=\"submit\" value=\"Сохранить\">\</td>\
          <td></td>\
        </tr>\
      </table>\
    </form>\
  </body>\
</html>";
const String postForms2 = "<html>\
  <head>\
    <title>Подключение Distiller к серверу</title>\
    <meta charset=\"utf-8\">\
    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no, shrink-to-fit=no\">\
    <style>\
      body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\
    </style>\
  </head>\
  <body>\
    <center><h1>Подключение к серверу удаленного доступа</h1></center><br>\
    <form method=\"post\" enctype=\"application/x-www-form-urlencoded\" action=\"/postform2/\">\
      <table cellpadding=\"3\" width=\"100%\">\
        <tr>\
          <td>Email</td>\
          <td><input type=\"text\" name=\"email\" value=\"\"></td>\
        </tr>\
        <tr>\
          <td>Пароль</td>\
          <td><input type=\"text\" name=\"password\" type=\"password\" value=\"\"></td>\
        </tr>\
        <tr>\
          <td><input type=\"submit\" value=\"Сохранить\">\</td>\
          <td></td>\
        </tr>\
      </table>\
    </form>\
  </body>\
</html>";
const String postForms3 = "<html>\
  <head>\
    <title>Отчет</title>\
    <meta charset=\"utf-8\">\
    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no, shrink-to-fit=no\">\
    <style>\
      body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\
    </style>\
  </head>\
  <body>\
    <center><h3>Данные успешно приняты, отсоедените перемычку и перезагрузите устройство!</h3></center>\
  </body>\
</html>";
//Запись в епром
String handleForm() 
  {
    if (server.method() == HTTP_POST) 
      {
        digitalWrite(led, 1);
        String message = "POST form was:\n";
        for (uint8_t i = 0; i < server.args(); i++) 
          {
            message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
            if(server.argName(i)=="ssid"){writeString(0, server.arg(i));}
            if(server.argName(i)=="ssid_password"){writeString(50, server.arg(i));}
            if(server.argName(i)=="email"){writeString(100, server.arg(i));}
            if(server.argName(i)=="password"){writeString(150, server.arg(i));}
          }
        return message;   
    }
  }
void handleRoot1() 
  {
    digitalWrite(led, 1);
    server.send(200, "text/html", postForms1);
    digitalWrite(led, 0);
  }
void handleRoot2() 
  {
    digitalWrite(led, 1);
    server.send(200, "text/html", postForms2+handleForm());
    //server.send(200, "text/html", postForms2);
    digitalWrite(led, 0);
  }
void handleRoot3() 
  {
    digitalWrite(led, 1);
    ssid_my = read_String(0);
  ssid_password_my = read_String(50);
  email_my = read_String(100);
  password_my = read_String(150);
    //server.send(200, "text/html", postForms3+handleForm());
    //server.send(200, "text/html", postForms3);
    server.send(200, "text/html", postForms3+ssid_my+ssid_password_my+email_my+password_my);
    digitalWrite(led, 0);
  }
void handlePlain() 
  {
    if (server.method() == HTTP_POST) 
      {
        digitalWrite(led, 1);
        server.send(200, "text/plain", "POST body was:\n" + server.arg("plain"));  
        digitalWrite(led, 0);
      }
  }
//Запуск сервера
void StartServer()
  {
      Serial.println();
      Serial.print("Configuring access point...");
      /* You can remove the password parameter if you want the AP to be open. */
      WiFi.softAP(ssid, password);
      IPAddress myIP = WiFi.softAPIP();
      Serial.print("AP IP address: ");
      Serial.println(myIP);
      server.begin();
      Serial.println("HTTP server started");
      //Проверяем что в eprom
      if (MDNS.begin("esp8266")){Serial.println("MDNS responder started");}
      //Если контакт не замкнут на массу то условие выполняется
      server.on("/", handleRoot1);
      server.on("/postform1/", handleRoot2);
      server.on("/postform2/", handleRoot3);  
      server.begin();
      Serial.println("HTTP server started");  
  }

При срабатывании void handleRoot3() , выводит все что записалось в долговременную память, так вот имя сети и пароль сети выводит нормально, логин и пароль доступа к сайту это все вопросы, не могу понять почему.

3d_killer
Offline
Зарегистрирован: 13.06.2018

переменные объявлены так static String ssid_my = "";

static String ssid_password_my = "";
static String email_my = "";
static String password_my = "";
3d_killer
Offline
Зарегистрирован: 13.06.2018

Да и вобще я смотрю запись в память один раз прошла, а теперь постоянно выдает старые данные

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

3d_killer,

в посте №1 я Вам писал

ЕвгенийП пишет:

А скетч полностью можно?

В посте №3 я Вам пояснил

ЕвгенийП пишет:

Я Вас попросил дать мне полный скетч, в котором видна проблема. 

Я просто хотел запустить Ваш скетч у себя, увидеть проблему, исправить её и подсказать Вам. Но для этого скетч должен быть полным, чтобы он компилировался и запускался. Вы же в посте #7 опять дали мне какой-то огрызок без начала и без конца.

Третий раз я Вас ни о чём просить не буду. Если Вам это не нужно, то мне и подавно. На будущее, посмотрите в словаре что означает слово "полный".