Как установить максимальное время выполнения операции

arduino-uno json error

Я десериализую вывод JSON из ESP8266 в своем Arduino UNO, но когда он терпит неудачу (по какой-то причине каждый раз после успешной десериализации), программа отстает на несколько секунд, и я не хочу, чтобы это происходило (по крайней мере, в течение длительного времени).

#include "SevSeg.h"
#include <ArduinoJson.h>
SevSeg sevseg; 

StaticJsonDocument<500> response;

String data;

void setup(){
  Serial.begin(74880);
  Serial.setTimeout(10000);
  while (!Serial) {
     // wait for serial port to connect. Needed for native USB port only
  }
  byte numDigits = 4;
  byte digitPins[] = {2, 3, 4, 5};
  byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13};
  bool resistorsOnSegments = false; // 'false' means resistors are on digit pins
  byte hardwareConfig = COMMON_ANODE; // See README.md for options
  bool updateWithDelays = false; // Default 'false' is Recommended
  bool leadingZeros = false; // Use 'true' if you'd like to keep the leading zeros
  bool disableDecPoint = false; // Use 'true' if your decimal point doesn't exist or isn't connected. Then, you only need to specify 7 segmentPins[]

  sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments,
  updateWithDelays, leadingZeros, disableDecPoint);
  Serial.println("running");

}

void loop(){

       if (Serial.available()) {
            Serial.write(Serial.read());
            const auto deser_err = deserializeJson(response, Serial);
       
            if (!deser_err) {
                
                if(response["type"] == "num"){
                  sevseg.setNumber(response["data"],response["dot"]);
                }else{
                  sevseg.setChars(response["data"]);
                }
                String data = response["data"];
                Serial.println(data);

            }else{
              Serial.print(F("Failed to deserialize, reason: \""));
              Serial.print(deser_err.c_str());
              Serial.println('"');
            }
            
       
  
      }

  sevseg.refreshDisplay();


}

Ответ

running  //runs everytime I turn on the arduino
21:43:03.797 -> {null
21:43:03.797 -> :null
21:43:03.797 -> ,null
21:43:03.797 -> :null
21:43:03.797 -> ,null
21:43:03.797 -> :Failed to deserialize, reason: "InvalidInput" // for some reason I have to send request 2 times because for the first time it always fails
21:43:03.797 -> 
Uove //correct data received
21:43:04.772 -> // this timestamp isn't right it is like 5 seconds after correct data
Failed to deserialize, reason: "EmptyInput"

Что я могу сделать, чтобы это не произошло в первый раз или в более короткий срок?

Я был бы очень благодарен за любой ответ.

, 👍1

Обсуждение

итак, программа делает что-то другое, когда она успешно десериализуется, и вы хотите знать, почему она делает что-то другое?, @jsotola

Да и это тоже, у меня есть много вопросов по поводу этого странного поведения, @krystof18

Что именно вы посылаете по сериалу? Первый персонаж будет эхом повторяться по сериалу. Он не используется дезертирами. Это может быть проблемой в зависимости от того, что вы посылаете., @chrisl

Знаете ли вы, каков тайм-аут десериализации из последовательного? Этот тайм-аут-это то, что занимает так много времени., @chrisl

Я не знаю, и я тоже не мог найти его, но я заметил, что чем ниже "Serial.setTimeout", тем короче продолжительность ожидания, но когда u установил его слишком низко, он не хочет ничего десериализовать (текущие 10s минимальны для правильной работы), @krystof18

Я думаю, что вы не должны десериализовываться непосредственно из серийного номера. Вместо этого отправляйте данные json с символом новой строки в конце, считывайте данные в буфер до тех пор, пока не прочтете символ новой строки. Затем выполните десериализацию этого буфера. В настоящее время вы явно разделываете строку json. Вы до сих пор не написали, что именно отправляете по последовательному каналу. Пожалуйста включите эту информацию в свой вопрос, @chrisl

удалите большой тайм-аут. добавьте "while (Serial.read() != -1);" после deserializeJson, чтобы прочитать символы новой строки, которые заставляют вводить десериализацию без данных. и удалить Serial.write(Serial.read());, @Juraj