diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino index 728d20f7f..b1cc56a68 100644 --- a/tasmota/support_tasmota.ino +++ b/tasmota/support_tasmota.ino @@ -1232,7 +1232,7 @@ void SerialInput(void) } else if ((serial_in_byte_counter == INPUT_BUFFER_SIZE) #ifdef ESP8266 -// || Serial.hasOverrun() // Default ESP8266 Serial buffer size is 256. Tasmota increases to INPUT_BUFFER_SIZE + || Serial.hasOverrun() // Default ESP8266 Serial buffer size is 256. Tasmota increases to INPUT_BUFFER_SIZE #endif ) { serial_buffer_overrun = true; diff --git a/tasmota/tasmota.ino b/tasmota/tasmota.ino index d1d841810..091b6eed3 100644 --- a/tasmota/tasmota.ino +++ b/tasmota/tasmota.ino @@ -198,8 +198,7 @@ char web_log[WEB_LOG_SIZE] = {'\0'}; // Web log buffer * Main \*********************************************************************************************/ -void setup(void) -{ +void setup(void) { #ifdef ESP32 #ifdef DISABLE_ESP32_BROWNOUT DisableBrownout(); // Workaround possible weak LDO resulting in brownout detection during Wifi connection @@ -216,7 +215,7 @@ void setup(void) RtcRebootSave(); Serial.begin(APP_BAUDRATE); - Serial.setRxBufferSize(INPUT_BUFFER_SIZE); // Default is 256 chars +// Serial.setRxBufferSize(INPUT_BUFFER_SIZE); // Default is 256 chars seriallog_level = LOG_LEVEL_INFO; // Allow specific serial messages until config loaded snprintf_P(my_version, sizeof(my_version), PSTR("%d.%d.%d"), VERSION >> 24 & 0xff, VERSION >> 16 & 0xff, VERSION >> 8 & 0xff); // Release version 6.3.0 @@ -325,8 +324,7 @@ void setup(void) XsnsCall(FUNC_INIT); } -void BacklogLoop(void) -{ +void BacklogLoop(void) { if (TimeReached(backlog_delay)) { if (!BACKLOG_EMPTY && !backlog_mutex) { #ifdef SUPPORT_IF_STATEMENT @@ -345,8 +343,18 @@ void BacklogLoop(void) } } -void loop(void) -{ +void SleepDelay(uint32_t mseconds) { + if (mseconds) { + for (uint32_t wait = 0; wait < mseconds; wait++) { + delay(1); + if (Serial.available()) { break; } // We need to service serial buffer ASAP as otherwise we get uart buffer overrun + } + } else { + delay(0); + } +} + +void loop(void) { uint32_t my_sleep = millis(); XdrvCall(FUNC_LOOP); @@ -396,23 +404,23 @@ void loop(void) uint32_t my_activity = millis() - my_sleep; - if (Settings.flag3.sleep_normal) { // SetOption60 - Enable normal sleep instead of dynamic sleep - // yield(); // yield == delay(0), delay contains yield, auto yield in loop - delay(ssleep); // https://github.com/esp8266/Arduino/issues/2021 + if (Settings.flag3.sleep_normal) { // SetOption60 - Enable normal sleep instead of dynamic sleep + // yield(); // yield == delay(0), delay contains yield, auto yield in loop + SleepDelay(ssleep); // https://github.com/esp8266/Arduino/issues/2021 } else { if (my_activity < (uint32_t)ssleep) { - delay((uint32_t)ssleep - my_activity); // Provide time for background tasks like wifi + SleepDelay((uint32_t)ssleep - my_activity); // Provide time for background tasks like wifi } else { if (global_state.wifi_down) { - delay(my_activity /2); // If wifi down and my_activity > setoption36 then force loop delay to 1/3 of my_activity period + SleepDelay(my_activity /2); // If wifi down and my_activity > setoption36 then force loop delay to 1/3 of my_activity period } } } - if (!my_activity) { my_activity++; } // We cannot divide by 0 + if (!my_activity) { my_activity++; } // We cannot divide by 0 uint32_t loop_delay = ssleep; - if (!loop_delay) { loop_delay++; } // We cannot divide by 0 - uint32_t loops_per_second = 1000 / loop_delay; // We need to keep track of this many loops per second + if (!loop_delay) { loop_delay++; } // We cannot divide by 0 + uint32_t loops_per_second = 1000 / loop_delay; // We need to keep track of this many loops per second uint32_t this_cycle_ratio = 100 * my_activity / loop_delay; loop_load_avg = loop_load_avg - (loop_load_avg / loops_per_second) + (this_cycle_ratio / loops_per_second); // Take away one loop average away and add the new one }