首页 > 解决方案 > JsonDocument 内存声明

问题描述

我正在使用 for 循环读取主文件(保存在我的 wemos D1 mini 的 SPIFFS 中)并将其拆分为 10 个不同的小文件,然后我想通过 HTTP 请求通过 Internet 发送每个文件。一切都很好,除了当我通过 HTTP 以 Node-red 发送文件时,我可以看到每个文件的最后一个对象缺少 2 个值:AcZ 和时间(见下图):

节点红色。对象缺少 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++arduino

解决方案


推荐阅读