Как установить максимальное время выполнения операции
Я десериализую вывод 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"
Что я могу сделать, чтобы это не произошло в первый раз или в более короткий срок?
Я был бы очень благодарен за любой ответ.
@krystof18, 👍1
Обсуждение0
Смотрите также:
- Получение всех данных моего объекта JSON из Serial.read() сразу
- Последовательная связь от Arduino до ESP8266 NodeMCU работает, но от NodeMCU до Arduino не работает
- Ошибка переменной does not name a type!
- Что означает avrdude: Device signature = 0x000000? Неисправная проводка? Проблема с программным обеспечением? Неправильная инструкция?
- TX,RX,ON,l светодиоды всегда были красными
- 4:1: ошибка: expected initializer before 'void'
- Строка JSON для Arduino WiFi версии 2
- Как преобразовать сериализованную строку JSON обратно в объект JSON?
итак, программа делает что-то другое, когда она успешно десериализуется, и вы хотите знать, почему она делает что-то другое?, @jsotola
Да и это тоже, у меня есть много вопросов по поводу этого странного поведения, @krystof18
Что именно вы посылаете по сериалу? Первый персонаж будет эхом повторяться по сериалу. Он не используется дезертирами. Это может быть проблемой в зависимости от того, что вы посылаете., @chrisl
Знаете ли вы, каков тайм-аут десериализации из последовательного? Этот тайм-аут-это то, что занимает так много времени., @chrisl
Я не знаю, и я тоже не мог найти его, но я заметил, что чем ниже "Serial.setTimeout", тем короче продолжительность ожидания, но когда u установил его слишком низко, он не хочет ничего десериализовать (текущие 10s минимальны для правильной работы), @krystof18
Я думаю, что вы не должны десериализовываться непосредственно из серийного номера. Вместо этого отправляйте данные json с символом новой строки в конце, считывайте данные в буфер до тех пор, пока не прочтете символ новой строки. Затем выполните десериализацию этого буфера. В настоящее время вы явно разделываете строку json. Вы до сих пор не написали, что именно отправляете по последовательному каналу. Пожалуйста включите эту информацию в свой вопрос, @chrisl
удалите большой тайм-аут. добавьте "while (Serial.read() != -1);" после deserializeJson, чтобы прочитать символы новой строки, которые заставляют вводить десериализацию без данных. и удалить
Serial.write(Serial.read());
, @Juraj