Я пытаюсь обслуживать большой массив с плавающей запятой с 8192 значениями из кучи ESP32 с помощью библиотеки ESPAsyncWebServer для ArduinoIDE. Μ C - это ESP32 devkit c, и я хочу получить доступ к массиву с помощью браузера. Вот код для массива:
#include "AsyncJson.h"
#include "ArduinoJson.h"
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
#define SAMPLES 8192
static float * vReal;
void setup() {
vReal = (float *) malloc(SAMPLES * sizeof(float));
assert(vReal != NULL);
}
void loop() {
//Put something into the array
for (int i = 0; i < SAMPLES; i++)
{
vReal[i] = 1.1;
}
}
В данный момент я использую «Arduino Json Basi c Response» и отправляю большой массив частями из 512 значений. С 1024 значениями я получаю переполнение стека в задаче async_tcp, если я пытаюсь получить доступ к массиву через браузер, поэтому я установил его на 512 значений. Вот код для этого:
server.on("/array1", HTTP_GET, [](AsyncWebServerRequest * request) {
AsyncResponseStream *response = request->beginResponseStream("application/json");
const size_t CAPACITY = JSON_ARRAY_SIZE(512); //Compute size of array
StaticJsonDocument<CAPACITY> vRealPart;
JsonArray array = vRealPart.to<JsonArray>();
for (int i = 0; i < 512; i++)
{
vRealPart.add(vReal[i]);
}
serializeJson(vRealPart, *response); //Print to HTML
request->send(response);
});
Я делаю это 16 раз, чтобы обслуживать весь массив. Позже я вызываю пути "/ array1", "/ array2", "/ array3" ... с помощью JavaScript и анализирую JSON. Это вывод, если один из путей вызывается в веб-браузере:
[0.334593,0.427480,0.181299,0.066654,0.271184,0.356220,0.374454,0.235625,...]
Это работает до сих пор большую часть времени, но я думаю, что это очень затянуто. Было бы неплохо, если бы существовал только один путь со всем массивом. Он работает с файлом stati c из SPIFFS, например:
server.serveStatic("/jsonArray1", SPIFFS, "/jsonArray1");
Но для записи всего массива в fla sh требуется много времени. Хотя чтение действительно быстрое.
Я также попробовал «Arduino Json Advanced Response», но я не смог заставить его работать с JsonArray. К сожалению, примеры на странице GitHub из ESPAsyncWebServer для Arduino Json устарели, поскольку они немного изменили синтаксис в новой версии (v6).
В двух словах: Каков наилучший способ обслуживания таких большие массивы из кучи ESP32 с библиотекой ESPAsyncWebServer? Цель состоит в том, чтобы обработать массив позже с помощью JavaScript в веб-браузере.
Спасибо за вашу помощь!
Bentiedem
PS: Если это поможет: я делаю БПФ с библиотекой arduinoFFT от тока двигателя. Поэтому я делаю AD C и сохраняю 16384 значения из аналого-цифрового преобразователя в массив. Этот массив передается в библиотеку FFT. На выходе получается массив с 8192 значениями. Этот результат находится в куче и должен быть перенесен в мой веб-интерфейс для отображения результата. Я хочу сохранить массивы в оперативной памяти для скорости. Для каждого измерения вы получаете массив результатов с 8192 значениями.