Почему ESP8266 не подключается к Wi-Fi при вызове yield()?

Я экспериментирую с ESP8266 и хочу, чтобы он переключался между различными состояниями: включение / выключение светодиода, включение / выключение Wi-Fi и измерение времени подключения, глубокий сон.

Я написал следующий скрипт, используя millis() для определения временных интервалов. Я вырезал предыдущие части кода, чтобы иметь минимальный тестовый пример.

Я читал, что ESP8266 автоматически включает сторожевой таймер, поэтому я использовал yield(), когда тратил время на ожидание, вместо того, чтобы использовать пустой цикл while. Я не использовал функцию delay(), потому что она блокирует дальнейшее выполнение кода, и я стараюсь избегать ее. Я знаю, что это тоже сбросило бы сторожевой таймер.

#include <ESP8266WiFi.h>

const char* ssid = "wifi";
const char* password = "pass";

const int led = 2;

void setup(void){
  unsigned long refTime;

  pinMode(led, OUTPUT);
  Serial.begin(115200);
  digitalWrite(led, 1);

  refTime = millis();
// исходит отсюда
  while ((millis() - refTime) < 3000) { yield(); }
// сюда

  Serial.println("Connecting...");
  refTime = millis();
  WiFi.begin(ssid, password);
  Serial.println("");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  // никогда не попадает сюда, когда включен код "issue"
  Serial.println(millis() - refTime);
  digitalWrite(led, 0);
}

void loop(void){

}

Если я использую yield(), то я никогда не получаю Wi-Fi-соединение (ну, на самом деле это произошло только один раз).

Почему доходность вызывает проблемы?

, 👍2

Обсуждение

почему бы просто не задержать () 3 секунды?, @dandavis

Потому что таким образом я могу добавить какой-то другой код в основной цикл и все равно получать мерцание вовремя. В этом примере мне это не нужно, но я часто нахожу это полезным. И все же, почему не работает? См. также https://learn.sparkfun.com/tutorials/esp8266-thing-hookup-guide/using-the-arduino-addon., @FarO

код выглядит нормально, но, возможно, попробуйте задержку (1) в цикле вместо yield()..., @dandavis


1 ответ


-1

Вставьте refTime = millis(); внутри цикла while.

,

Это не объясняет, почему "выход" мешает установить соединение, @FarO

Как это будет работать? Если вы сделаете это, цикл никогда не закончится., @Nick Gammon

Это не дает ответа на вопрос. Как только у вас будет достаточно [репутации] (https://arduino.stackexchange.com/help/whats-reputation), вы сможете [комментировать любой пост] (https://arduino.stackexchange.com/help/привилегии). /комментарий); вместо этого [дайте ответы, которые не требуют пояснений от спрашивающего](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can -я-делаю-вместо). - [Из обзора](/review/low-quality-posts/55526), @Dmitry Grigoryev

Я хочу, чтобы пользователь, который проголосовал за этот ответ, объяснил свою мотивацию для этого., @Dmitry Grigoryev