Arduino Polska Forum

Pełna wersja: ESP8266 - problem z pętlą while do
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
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();
     }
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();
     }
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;
     }
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?
(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ę
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