我正在尝试使用 ArduinoIDE 的 ESPAsyncWebServer 库从 ESP32 堆中提供一个具有 8192 个值的大型浮点数组。µ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;
}
}
目前,我使用“ArduinoJson Basic 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 次以服务整个阵列。后来,我用JavaScript调用路径的“/array1”、“/array2”、“/array3”……并解析JSON。如果在网络浏览器中调用其中一个路径,则这是输出:
[0.334593,0.427480,0.181299,0.066654,0.271184,0.356220,0.374454,0.235625,...]
到目前为止,这在大多数情况下都有效,但我认为它非常冗长。如果整个阵列只有一条路径,那就太好了。它适用于来自 SPIFFS 的静态文件,例如:
server.serveStatic("/jsonArray1", SPIFFS, "/jsonArray1");
但是将整个阵列写入闪存需要很长时间。虽然阅读速度真的很快。
我也尝试了“ArduinoJson Advanced Response”,但我无法让它与 JsonArray 一起运行。不幸的是,ESPAsyncWebServer for ArduinoJson 的 GitHub 页面上的示例已被弃用,因为它们在新版本 (v6) 中稍微更改了语法。
简而言之:使用 ESPAsyncWebServer 库从 ESP32 堆中提供如此大的数组的最佳方式是什么?目标是稍后在网络浏览器中使用 JavaScript 处理数组。
谢谢你的帮助!
本蒂德姆
PS:如果有帮助:我正在用电机电流的库 arduinoFFT 进行 FFT。因此,我做了一个 ADC 并将模数转换器中的 16384 个值保存在一个数组中。该数组被传递到 FFT 库。输出是一个包含 8192 个值的数组。此结果在堆中,应传输到我的 Web 界面以显示结果。我想将阵列保留在 RAM 中以提高速度。对于每次测量,您都会得到一个包含 8192 个值的结果数组。