Как написать объект Arrey в EEPROM в ESP32 - PullRequest
0 голосов
/ 29 января 2019

Привет, ребята, мне нужно заниматься проектом в школе.Позвольте мне объяснить вам, что это такое.
Я получил микропроцессор ESP32 .

Я использую этот ESP32, чтобы создать сеть WLAN и обслуживать некоторые html-страницы в ней.Поэтому я использую его как точку доступа и веб-сервер одновременно.
Причина, по которой мне это нужно, заключается в том, чтобы отображать некоторую информацию с помощью GET-запросов и получать некоторую информацию с помощью POST-запросов для конфигурации ESP32.

В любом случае, яудалось обработать оба (GET и POST) запроса без каких-либо проблем, используя библиотеку ESPAsyncWebServer GitHub из ESPAsyncWebServer .

Я использую специальный root"/ admin" для обработки запросов GET и POST для конфигурации.
Все отлично работает.Проблема возникает, когда я пытаюсь сохранить данные в массиве потоков внутри моей EEPROM .

Код структуры:

struct Hour{
    String ring_in; //time -> "hh:mm"
    String ring_out; //time -> "hh:mm"
    String ring; //boolean -> "checked" or ""
    String play_music; //boolean -> "checked" or ""
};

Код, который обрабатывает запросы POST в "/admin "и заполняет массив 27 параметрами POST.

server.on("/admin", HTTP_POST, [](AsyncWebServerRequest *request){  // ~~~ POST 192.148.4.1/admin
AsyncWebParameter* p = request->getParam("download", true);
Hour hours_values[7];
int counter = 0;
for(int i=0; i<7; i++){// Loop used to asaign the values from POST request.
  hours_values[i].ring_in = request->arg(counter).c_str();
  hours_values[i].ring_out = request->arg(counter+1).c_str();
  hours_values[i].ring = request->arg(counter+2).c_str();
  hours_values[i].play_music = request->arg(counter+3).c_str();
  counter += 4;
}
for(int i=0; i<7; i++){ // Loop that proofs values are ok and just can't be loaded to EEPROM.
  Serial.println(hours_values[i].ring_in);
  Serial.println(hours_values[i].ring_out);
  Serial.println(hours_values[i].ring);
  Serial.println(hours_values[i].play_music);
}
EEPROM.put(0, hours_values); delay(500); EEPROM.end(); //THIS THING DOESN'T WORK.
request->send(200, "text/html", "Changes have been saved. Refresh to see the changes!");
});

Поэтому, когда я пытаюсь получить данные из EEPROM для обработки запроса GET, программа завершается с ошибкой .
Сообщение:

Rebooting...
ets Jun  8 2016 00:22:57</p>

<p>rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:928
ho 0 tail 12 room 4
load:0x40078000,len:9280
load:0x40080400,len:5848
entry 0x40080698

Код запроса GET "/ admin":

  server.on("/admin", HTTP_GET, [](AsyncWebServerRequest *request){  // ~~~ GET 192.148.4.1/admin
    Hour hours[7] = EEPROM.get(0, hours_values); //Can't get data from here.
    String html = "Some long long long html that includes values of Hours[] arrey"
    request->send(200, "text/html", html);
});

Итак, ребята, есть ли другой способ, которым я должен использовать методы EEPROM.put () и EEPROM.get () , когда мне приходится иметь дело с массивом структур ине просто структура?Или что-то еще?

Заранее спасибо!

...