HTML-страница переменной ESP8266 Webserver ESP8266WebServer (не как один постоянный символ)

Цель состоит в том, чтобы отобразить нестатическую HTML-страницу в зависимости от некоторого переменного условия.

В коде, который я создал, есть проблема, заключающаяся в том, что esp8266 сбрасывает настройки в тот момент, когда я запрашиваю страницу.

const char htmlIndexHeader[] PROGMEM = R"=====(
<html>
<head>
    <meta http-equiv="content-type" content="text/html;charset=UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Test</title>
</head>
<body>
  <p>Hello World</p>
  <ol>
)=====";

const char htmlIndexProgress1[] PROGMEM = R"=====(
        <li>lorem</li>
)====="; 

const char htmlIndexProgress2[] PROGMEM = R"=====(
        <li>ipsum</li>
)====="; 

const char htmlIndexFooter[] PROGMEM = R"=====(
        </ol>
</body>
</html>
)====="; 

char htmlIndexAll[2000]; 

void handleRoot() 
{
  Serial.println("GET /");

   strcpy(htmlIndexAll, htmlIndexHeader);

   if(var1==true)
   {
     strcat(htmlIndexAll, htmlIndexProgress1);
   }

   if(var2==true)
   {
     strcat(htmlIndexAll, htmlIndexProgress2);
   } 

   strcat(htmlIndexAll, htmlIndexFooter);

  server.send(200, "text/html", htmlIndexAll);
}

Если я показываю статическую страницу, esp8266 не перезапускается при запросе страницы.

, 👍2

Обсуждение

попробуйте strcpy_P и strcat_P, @Juraj

@Juraj это работает!, @kimliv


1 ответ


Лучший ответ:

2

Компилятор не может отличить строки PROGMEM от строк-констант в строках SRAM. Оба являются const char*. Но строка PROGMEM должна обрабатываться по-другому. По этой причине существует _P вариантов функций.

Вы должны использовать функции stcpy_P и strcat_P.

Примечание: на esp8266 некоторые функции ядра Arduino используют трюк для идентификации строк PROGMEM по их конкретному диапазону адресов.

,