ESP8266 проблема с записью и чтением долговременной памяти
- Войдите на сайт для отправки комментариев
Ср, 29/07/2020 - 20:05
Пробую добавить логин и пароль для подключения к точке доступа, а при попытке чтения там всякая ерунда хотя имя точки и пароль на английском и присутствуют цифры.
Запись и чтение с епрома делаю функциями
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⸮
А скетч полностью можно? Записи и чтения. А то, много вопросов остаётся.
Это когда запущен сервер, работает этот код:
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"); }Остальное к записи и чтению не относится (много кода с другими операциями связанного)
еще раз загрузил скетч и оно заработало, может ошибка какая записи...
А где обещанная печать, о которой Вы говорили?
Её нет в этом коде. Более того, в нём вообще нет "read_String". В чём тогда его проблема?
в первом же посте перед выводом, пропустили?
Причём тут первый пост?
Я Вас попросил дать мне полный скетч, в котором видна проблема. Вы дали в #2. Но в #2 нет ни функции чтения, ни печати результатов.
В старых постах скетчи неполные и сказать ничего нельзя. например, ХЗ как у Вас переменные описаны.
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() , выводит все что записалось в долговременную память, так вот имя сети и пароль сети выводит нормально, логин и пароль доступа к сайту это все вопросы, не могу понять почему.
переменные объявлены так static String ssid_my = "";
Да и вобще я смотрю запись в память один раз прошла, а теперь постоянно выдает старые данные
3d_killer,
в посте №1 я Вам писал
А скетч полностью можно?
В посте №3 я Вам пояснил
Я Вас попросил дать мне полный скетч, в котором видна проблема.
Я просто хотел запустить Ваш скетч у себя, увидеть проблему, исправить её и подсказать Вам. Но для этого скетч должен быть полным, чтобы он компилировался и запускался. Вы же в посте #7 опять дали мне какой-то огрызок без начала и без конца.
Третий раз я Вас ни о чём просить не буду. Если Вам это не нужно, то мне и подавно. На будущее, посмотрите в словаре что означает слово "полный".