c++ - JsonDocument 内存声明
问题描述
我正在使用 for 循环读取主文件(保存在我的 wemos D1 mini 的 SPIFFS 中)并将其拆分为 10 个不同的小文件,然后我想通过 HTTP 请求通过 Internet 发送每个文件。一切都很好,除了当我通过 HTTP 以 Node-red 发送文件时,我可以看到每个文件的最后一个对象缺少 2 个值:AcZ 和时间(见下图):
我认为这是 JsonDocument 的内存声明问题。我真的很了解 C++ 和 ArduinoJson。无论如何,我在文档中读到 doc.clear() 会重置内存池但不会破坏它。而且我认为问题在于我以某种方式复制了某些内容并超出了内存。这真的是问题吗?提前致谢
这就是我声明 JsonDocument 的内存的方式:
const size_t capacity = JSON_OBJECT_SIZE(1) + JSON_OBJECT_SIZE(4) + JSON_ARRAY_SIZE(1) + JSON_ARRAY_SIZE(10) + 10*JSON_OBJECT_SIZE(4) + 10;
这就是功能:
//------ HTTP Publish ------
void httpPublish(){
const char * outputFileNames[] = {"/out1.txt", "/out2.txt", "/out3.txt", "/out4.txt", "/out5.txt", "/out6.txt", "/out7.txt", "/out8.txt", "/out9.txt", "/out10.txt"};
const byte outputCount = sizeof outputFileNames / sizeof outputFileNames[0];
byte outputIndex = 0;
File sourceFile;
File destinationFile;
//Serial.println(capacity);
for (byte idx = 0; idx < outputCount; idx++) {
DynamicJsonDocument doc(capacity);
DynamicJsonDocument globalDoc(capacity);
StaticJsonDocument <1024> localDoc;
String aLine;
aLine.reserve(capacity);
destinationFile = LittleFS.open(outputFileNames[idx], "r");
if (!destinationFile) {
Serial.print(F("can't open destination "));
Serial.println(outputFileNames[idx]);
break;
} else {
Serial.print("Reading: ");
Serial.println(outputFileNames[idx]);
//int lineCount = 0;
while (destinationFile.available()) {
aLine = destinationFile.readStringUntil('\n');
DeserializationError error = deserializeJson(localDoc, aLine);
if (!error) globalDoc.add(localDoc);
else{ Serial.println("Error Writing All files");}
}//while
JsonObject Info = doc.createNestedObject("Info");
Info["Battery"] = battery;
Info["ID"] = id;
Info["Latitudine"] = latitudine;
Info["Longitudine"] = longitudine;
JsonArray Data = doc.createNestedArray("Data");
Data.add(globalDoc);
HTTPClient http;
//Send request
http.begin("http://raspi-hyperink:1880/postjdoc");
char buffer[capacity];
size_t n = serializeJson(doc, buffer);
http.POST(buffer);
Serial.println(buffer);
http.end();
destinationFile.close();
}
}// end for
}//end httpPublish
解决方案
推荐阅读
- c++ - 为什么在 C 中不允许使用 `&`,但在这种情况下在 C++ 中?有什么异议吗?
- c# - 如何从列表整数中使用最小键获取最大计数,linq 写在一个表达式中
- r - oneHotEncode R中的光栅层
- python - 将列设置为列索引 Pandas 数据框
- node.js - 即使使用 `credentials: 'include'` 也无法使用 cookie 获取
- python - 最小化 numpy 数组操作的运行时间
- reactjs - 如何使用 React 设置 Eslint
- textx - TextX 如何定义单词之间的边界?
- sql - 无法在 AWS Lambda 中填充 Athena 脚本
- javascript - 如何根据具有固定字符数但字体大小可能不同的输入来调整文本框宽度?