Problema Soft WDT reset em uma lista json

QUando faço meu json uma lista até 9 posiçoes ele me mostra certinho
o json com 9 posições. A partir que coloco 10 ou mais da WDT reset.
Antes usava server.arg("plain") e funcionava bem com lista json grande mas agora alterei para Asyncrono

O codigo é assim

 server.on("/gravarAgendamento", HTTP_POST,[](AsyncWebServerRequest *request){}, NULL,
        [](AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total) {


            


      jsonBuffer.reserve(8192);  // Ajuste para o tamanho máximo esperado

      if (index == 0) {
          jsonBuffer.clear();  // Limpa buffer ao começar novo JSON
          jsonBuffer.reserve(total);  // Reserva memória
          Serial.printf("🔄 Iniciando recebimento de JSON (%d bytes)\n", total);

      }

      if (jsonBuffer.capacity() < jsonBuffer.size() + len) {
          Serial.println("⚠️ JSON grande demais! Abortando...");
          request->send(413, "application/json", "{\"erro\": \"JSON muito grande\"}");
          return;
      }
         
      jsonBuffer.reserve(jsonBuffer.size() + len);  // Reserva espaço antecipadamente
      Serial.println(ESP.getFreeHeap());  // Exibe a memória livre

      size_t chunkSize = 100;  // Tamanho do chunk
       //ESP.wdtDisable();
      for (size_t i = 0; i < len; i += chunkSize) {
          size_t remaining = len - i;
          size_t size = (remaining < chunkSize) ? remaining : chunkSize;
          jsonBuffer.insert(jsonBuffer.end(), data + i, data + i + size);
          delay(0);  // Permite que o sistema processe outras tarefas
      }

      Serial.printf("Recebido (%d/%d bytes)\n", index + len, total);    

      // Se terminou de receber todo o JSON, processa os dados
      if (index + len == total) {
          Serial.println("📩 JSON Completo Recebido:");
          jsonBuffer.push_back('\0');  // Garante finalização da string
          

          // Criar um documento JSON dinâmico
          DynamicJsonDocument doc(8192);  // Aumente se necessário
          DeserializationError error = deserializeJson(doc,jsonBuffer.data());

          if (error) {
              Serial.print("❌ Erro ao parsear JSON: ");
              Serial.println(error.c_str());
              request->send(400, "application/json", "{\"erro\": \"JSON inválido\"}");
              return;
          }

          // Verifica se o JSON recebido é um array
          if (doc.is<JsonArray>()) {
              Serial.println("📌 JSON recebido é um ARRAY!");
              JsonArray array = doc.as<JsonArray>();
              
              // Percorrer e exibir cada item da lista JSON
              Serial.println("🔽 Lista JSON recebida:");
              for (JsonVariant item : array) {
                  serializeJson(item, Serial);
                  Serial.println();
              }
          }
          // Se for um objeto normal, imprime diretamente
          else if (doc.is<JsonObject>()) {
              Serial.println("📌 JSON recebido é um OBJETO!");
              serializeJson(doc, Serial);
              Serial.println();
          }

          Serial.println("📌 JSON Processado com Sucesso!");
          // Retornasucesso para o cliente
          request->send(200, "application/json", "{\"status\": \"ok\"}");
      }

   
      
});

A lista que funciona até 9 posições se você verem é uma lista grande
18:03:03.055 -> {"key":1,"id":"12930","codUser":12,"codbomba":1,"dosagem":55.55555556,"hora":"13:00","diasemana":"Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday","flag":0,"bombaativa":"on","calibracao":"50"}

18:03:03.255 -> {"key":2,"id":"12931","codUser":12,"codbomba":1,"dosagem":55.55555556,"hora":"13:06","diasemana":"Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday","flag":0,"bombaativa":"on","calibracao":"50"}

18:03:03.489 -> {"key":3,"id":"12932","codUser":12,"codbomba":1,"dosagem":55.55555556,"hora":"13:09","diasemana":"Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday","flag":0,"bombaativa":"on","calibracao":"50"}

18:03:03.689 -> {"key":4,"id":"12933","codUser":12,"codbomba":1,"dosagem":55.55555556,"hora":"13:12","diasemana":"Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday","flag":0,"bombaativa":"on","calibracao":"50"}

18:03:03.889 -> {"key":5,"id":"12934","codUser":12,"codbomba":1,"dosagem":55.55555556,"hora":"13:15","diasemana":"Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday","flag":0,"bombaativa":"on","calibracao":"50"}

18:03:04.122 -> {"key":6,"id":"12935","codUser":12,"codbomba":1,"dosagem":55.55555556,"hora":"13:18","diasemana":"Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday","flag":0,"bombaativa":"on","calibracao":"50"}

18:03:04.322 -> {"key":7,"id":"12936","codUser":12,"codbomba":1,"dosagem":55.55555556,"hora":"13:21","diasemana":"Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday","flag":0,"bombaativa":"on","calibracao":"50"}

18:03:04.553 -> {"key":8,"id":"12937","codUser":12,"codbomba":1,"dosagem":55.55555556,"hora":"13:24","diasemana":"Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday","flag":0,"bombaativa":"on","calibracao":"50"}

18:03:04.789 -> {"key":9,"id":"12938","codUser":12,"codbomba":1,"dosagem":55.55555556,"hora":"13:27","diasemana":"Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday","flag":0,"bombaativa":"on","calibracao":"50"}

Boa noite.
Então, o WDT é acionado quando o processamento ultrapassa os 8.3 segundo. Possivelmente a 10 posição do JSON esteja acima de limite.
Uma saída simples e prática seria atualizar o chamada do WDT no inicio do JSON. Caso ainda continue ocorrendo timerout, desconsidere a nova chamada do WDT no inicio e mude a camada do WDT para o final de cada FOR. Isso irá atualizar o timerout do WDT e terá 8.3 para processar casa ciclo do FOR.

Dica: Habilite, caso não tenha habilitado, a data e hora no serial monitor. Depois, coloque pontos de verificação em vários pontos do código e verifique o tempo que será marcado entre cada ponto de verificação com Serial.println("verificacao A"), verificacao B, etc... Seria ideia colocar um ponto antes e um depois do processamento do JSON ou antes de depois em cada FOR.

Assim, saberá quanto tempo de processamento cada bloco.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.