• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
ESP8266 - problem z pętlą while do
#1
Sad 
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();
     }
 
Odpowiedź
#2
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();
     }
 
Odpowiedź
#3
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;
     }
 
Odpowiedź
#4
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?
 
Odpowiedź
#5
(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ę
 
Odpowiedź
#6
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
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości