Инициализатор ошибок-строка для массива символов слишком длинная с использованием веб-сервера ESP32

я попытался использовать асинхронный веб-сервер для нового проекта с друзьями с помощью этого урока. Мы хотим запустить FFT, а также изменить некоторые настройки через веб-сервер. Поскольку в учебнике в setup() был указан только код, я подумал, что это будет полезно для производительности.

Когда я просто копирую, вставляю код, он работает довольно хорошо, но потом я захотел все переделать в классы, как хороший мальчик. Теперь я получаю эту ошибку:

 In file included from sketch\webserver.cpp:2:0:
webserver.h:36:29: error: initializer-string for array of chars is too long [-fpermissive]
   const char index_html[] = R"rawliteral(
                             
sketch\webserver.cpp: In constructor 'webserver::webserver()':
webserver.cpp:4:22: error: initializer-string for array of chars is too long [-fpermissive]
 webserver::webserver() {

Я попытался найти решение, но все остальные проблемы, связанные с этим типом ошибок, похоже, не соответствовали моей проблеме.

Это файл заголовка, в котором объявлена строка char

#ifndef webserver_h
#define webserver_h

#include "Arduino.h"
#include "ESPAsyncWebServer.h"
#include "AsyncTCP.h"
#include <WiFi.h>

class webserver {
  
  private:
  // Вставка Частных Переменных И Функций
  
   // Замените свои сетевые учетные данные
  const char* ssid     = "ESP32-Todesstern";
  const char* password = "CaptainHook";

  const char* PARAM_INPUT_1 = "input1";
  const char* PARAM_INPUT_2 = "input2";
  const char* PARAM_INPUT_3 = "input3";
  
  // Установите номер порта веб-сервера на 80
  AsyncWebServer server(int port);
  
  // Переменная для хранения HTTP-запроса
  String header;

  IPAddress IP;
  //WiFiClient client;

  public: 
  //Вставка открытых переменных и функций
  webserver();
  
  String music_state;

  const char index_html[] PROGMEM = R"rawliteral(
  <!DOCTYPE HTML><html><head>
    <title>ESP Input Form</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    </head><body>
    <form action="/get">
      input1: <input type="text" name="input1">
      <input type="submit" value="Submit">
    </form><br>
    <form action="/get">
      input2: <input type="text" name="input2">
      <input type="submit" value="Submit">
    </form><br>
    <form action="/get">
      input3: <input type="text" name="input3">
      <input type="submit" value="Submit">
    </form>
  </body></html>
  )rawliteral";

  void setup_server(AsyncWebServer server);

  void notFound(AsyncWebServerRequest *request);
 
};

#endif

Спасибо за помощь,

Ксеношелл

, 👍1

Обсуждение

Я не знаю, почему вы получаете именно это сообщение, но: "const char *index_html PROGMEM =" В вопросе или решениях(решениях) нет ничего специфичного для ESP32 или Arduino. Для того, что вы пытаетесь сделать, вероятно, имело бы смысл, чтобы он был статическим (тем более, если вам действительно нужен массив по какой-то причине) и определялся вне класса или, возможно, с использованием более новой функции встроенной переменной. Или оба объявлены и определены вне класса., @timemage


1 ответ


1

Пожалуйста, проверьте readme: https://github.com/me-no-dev/ESPAsyncWebServer#send-large-webpage-from-progmem

Вам, вероятно, придется объявить это в progmem без rawliteral.

const char index_html[] PROGMEM = "..."; // большой массив символов, протестированный с запросом 14k->send_P(200, "текст/html", index_html);>

,

Если вы попытаетесь скомпилировать (на ESP32 или что-либо еще, если на то пошло) с "PROGMEM" или без него, с большим количеством материала в строковом литерале или без него, вы увидите то же самое сообщение., @timemage