Импорт содержимого текстового файла в виде строки в код Arduino

Существует ли какой-либо макрос для импорта содержимого файла (например, html-кода), расположенного в папке скетча, в виде строки для Arduino IDE во время компиляции?

, 👍2


3 ответа


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

3

Для ESP32 (и ESP8266) вы можете разделить часть флэш-памяти для использования в качестве файловой системы и создать в проекте папку data/ для хранения файлов. Ознакомьтесь с arduino-esp32littlefs-plugin (используется для загрузки данных в раздел), чтобы узнать, как установить плагин в Arduino IDE и библиотеку LittleFS или SPIFFS о том, как использовать его для хранения и извлечения данных.

У меня есть проект на GitHub, показывающий, как SPIFFS используется для хранения веб-страниц (html, JavaScript, CSS, значок и т. д.) и обслуживать его через асинхронный сервер ESP32. Перейдя по ссылке на GitHub, вы сможете получить более подробное объяснение в блоге.

,

Это очень хороший небольшой проект: современный и простой подход, код короткий и простой, очень четкие объяснения в вашем блоге… Он может стать своего рода хорошим «эталонным примером» для людей, стремящихся создать веб-сервер для аппаратного проекта. ., @Edgar Bonet

Спасибо @EdgarBonet за ваши комплименты., @hcheung


0

Короче говоря, нет. То, что я знаю об IDE, языках и системе сборки, не позволяет сделать это автоматически. Было бы неплохо, если бы в C++ было что-то вроде include_str или < a href="https://doc.rust-lang.org/std/macro.include_bytes.html">include_bytes, но, насколько я знаю, это все еще не так.< /п>

Ваш вопрос отмечен тегом esp32. Возможно, вы захотите добавить строки в раздел данных, если они большие.

Есть и другие способы сделать это, но обычный способ встроить произвольные данные в программу C++ или C — запустить утилиту, которая преобразует их в исходный код. Либо в строковый литерал, либо в инициализированный массив некоторого символьного типа. Утилита xxd, которая обычно поставляется с VIM, является одной из таких утилит. Обычно он используется для создания шестнадцатеричных дампов файлов, но его можно указать для создания исходного кода инициализированного массива. Подобные утилиты часто запускаются на этапе предварительной сборки более традиционного процесса сборки для C++. Вероятно, вы могли бы взломать что-нибудь в файле Platform.txt, чтобы это сделать. Или во что-то вроде git-хука. Но IDE не обладает такой гибкостью.

Вот веб-страница, которая делает то же самое. Если вы хотите это сделать, возможно, вам придется вручную завершить массив нулями.

,

2

Попробуйте использовать необработанный строковый литерал C++.

Это в форме

const char *myLiteralText=R"abc123~~~(
   this is
   literal text
   which includes all spaces
   and newlines
)abc123~~~"

abc123~~~ является разделителем.

Файл test.h необходимо изменить, добавив первую и последнюю строки.

На самом деле последняя строка в файле test.ino может находиться после строки #include, поэтому в test.h нужно добавить только первую строку. файл.

Пример: https://wokwi.com/projects/384484092370522113

test.ino

void setup() {

  Serial.begin(9600);

  const char *index_html=
    #include "test.h"
  ;
    
  Serial.print(index_html);

}

void loop() {}

test.h

R"html(

<!DOCTYPE html>
<html lang="en">
  <head>
      <meta charset="UTF-8">
      <title>VIPSDK MONITOR</title>
      <meta http-equiv="refresh" content="10">
  </head>
  <style type="text/css">
  </style>
</html>

)html"
,