Arduino Polska Forum
ESP8266 - problem z pętlą while do - Wersja do druku

+- Arduino Polska Forum (https://forum.arduinopolska.pl)
+-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino)
+--- Dział: Programowanie w Arduino (https://forum.arduinopolska.pl/dzial-programowanie-w-arduino)
+--- Wątek: ESP8266 - problem z pętlą while do (/watek-esp8266-problem-z-p%C4%99tl%C4%85-while-do)



ESP8266 - problem z pętlą while do - yugodriver - 16-11-2016

Cześć,

Mam problem z pętlą while do w ESP8266. Z chwilą gdy kontroler rozpoczyna pętle while, zawiesza się. Znalazłem informację w internecie, że jest to problem znany ale nigdzie nie znalazłem rozwiązania. Prosze o pomoc. Jak zmienić poniższy kod, tak żeby nie wykorzystywać pętli while do.
Kod:
   czas  = millis(); //ustaw zmienną czas równą aktualnej liczbie millis
   while ( millis() - czas < 60000 ); // sprawdź czy nie minęła minuta. Jeśli nie minęła to wykonuj pętlę
     {
      Serial.println( millis() - czas);
       serwer();
       SuplaDevice.iterate();
     }



RE: ESP8266 - problem z pętlą while do - krn78 - 16-11-2016

Nie jestem pewien, czy mam rację, ale po co średnik po warunku przy pętli while?
Jeśli przyjąć, że milis(); zwróci jakąś wartość do zmiennej czas, to potem uzależniasz pętlę while od różnicy milis() i wartości zmiennej czas. W efekcie da Ci to ok. 0, co na pewno jest mniejsze niż 60000. Jeśli potem jest średnik, to tak jakbyś wpisał kod:
while(1); - co powoduje powstanie niekończącej się pętli.
Na moje kod powinien wyglądać następująco:
Kod:
czas  = millis(); //ustaw zmienną czas równą aktualnej liczbie millis
   while ( millis() - czas < 60000 ) // sprawdź czy nie minęła minuta. Jeśli nie minęła to wykonuj pętlę
     {
      Serial.println( millis() - czas);
       serwer();
       SuplaDevice.iterate();
     }



RE: ESP8266 - problem z pętlą while do - yugodriver - 17-11-2016

też zauważyłem ten średnik, ale to nie w nim jest problem.  Problemem jest to, że procesor restartuje się w momencie dojścia do pętli while (jakiejkolwiek pętli while - nie tylko tej konkretnej).  Rozwiązaniem może być pętla for, ale przy tej pętli program nie chciał mi się kompilować :-( Problem rozwiązałem w następujący sposób (info dla potomnych :-) ):
Kod:
   czas  = millis();
   petla:
   if ( millis() - czas < 60000 )
     {
       serwer();
       SuplaDevice.iterate();
       goto petla;
     }



RE: ESP8266 - problem z pętlą while do - krn78 - 17-11-2016

Tyle że w przypadku warunku on wykona się raz lub się nie wykona Smile
A gdybyś spróbował, zamiast pętli while, zastosować pętlę do... while?


RE: ESP8266 - problem z pętlą while do - yugodriver - 17-11-2016

(17-11-2016, 14:00)krn78 napisał(a): Tyle że w przypadku warunku on wykona się raz lub się nie wykona Smile
A gdybyś spróbował, zamiast pętli while, zastosować pętlę do... while?

To może napiszę trzeci raz  Dodgy. While restartuje mikrokontroler.

Dlaczego warunek miałby się nie wykonać? Pętla będzie się wykonywać przez minutę


RE: ESP8266 - problem z pętlą while do - krn78 - 22-11-2016

Ok, nie zauważyłem polecenia goto Smile Przy okazji, nie wiedziałem, że Arduino je obsługuje. Człowiek uczy się całe życie Smile