Импорт содержимого текстового файла в виде строки в код Arduino
Существует ли какой-либо макрос для импорта содержимого файла (например, html-кода), расположенного в папке скетча, в виде строки для Arduino IDE во время компиляции?
@Ali.kavari76, 👍2
3 ответа
Лучший ответ:
Для ESP32 (и ESP8266) вы можете разделить часть флэш-памяти для использования в качестве файловой системы и создать в проекте папку data/
для хранения файлов. Ознакомьтесь с arduino-esp32littlefs-plugin (используется для загрузки данных в раздел), чтобы узнать, как установить плагин в Arduino IDE и библиотеку LittleFS или SPIFFS о том, как использовать его для хранения и извлечения данных.
У меня есть проект на GitHub, показывающий, как SPIFFS используется для хранения веб-страниц (html, JavaScript, CSS, значок и т. д.) и обслуживать его через асинхронный сервер ESP32. Перейдя по ссылке на GitHub, вы сможете получить более подробное объяснение в блоге.
Короче говоря, нет. То, что я знаю об 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 не обладает такой гибкостью.
Вот веб-страница, которая делает то же самое. Если вы хотите это сделать, возможно, вам придется вручную завершить массив нулями.
Попробуйте использовать необработанный строковый литерал 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"
- Как распечатать трассировку стека и зарегистрировать дампы на последовательном мониторе Arduino?
- ЖК-дисплей с I2C не распознается esp32
- Считывание данных нескольких датчиков из текстового файла, расположенного на SD-карте в Arduino/ESP32
- Код точки доступа ESP32 не компилируется
- avrdude ser_open() can't set com-state
- Float печатается только 2 десятичных знака после запятой
- ошибка: espcomm_upload_mem failed при загрузке скетча
- Печать массива байтов на экране последовательного монитора Arduino IDE
Это очень хороший небольшой проект: современный и простой подход, код короткий и простой, очень четкие объяснения в вашем блоге… Он может стать своего рода хорошим «эталонным примером» для людей, стремящихся создать веб-сервер для аппаратного проекта. ., @Edgar Bonet
Спасибо @EdgarBonet за ваши комплименты., @hcheung