Skocz do zawartości

Przerwanie pętli while


Pomocna odpowiedź

Napisano

Hej,

Mam problem...

Otóż, mój program w void loop nasłuchuje czy client.read coś nadaje, po odebraniu ciągu znaków odpala mi się dany if. Problem polega na tym, że w jednym z if mam pętle while która miga diodą. Chciałbym teraz po wysłaniu ponownie ciągu znaków wyłączać pętlę i przełączać diodę na LOW.

Przykład, wysyłam ciąg "START", if sprawdza warunek i odpala pętlę while migającą diodą. Po wpisaniu ponownie ciągu, tym razem "STOP", automatycznie coś przerywa pętlę i wyłącza diodę.

Przykład:

void loop() {
 EthernetClient client = server.available();

 if (client) { // Cy ktos podłaczył sie zdalnie
     txt = client.read();
     daneEth += txt;
       if (txt == '\n') {
         daneEth = "";
       }
       if (daneEth == "START") {
         while (true) {
           stan = !stan;
           digitalWrite(A5, stan);
           delay(100);
         }
       }
     }

Pomożecie ❓ 😅

[ Dodano: 03-10-2017, 13:16 ]

Chyba doszukałem się odpowiedzi na moje pytanie... zajęło mi to parę dni (dlatego też dopiero dzisiaj zdecydowałem się o tym tutaj napisać), na innym forum doszukałem się wątku o bibliotece Timers.h. Lekko przerobiłem i działa 😃 Jak ktoś byłby zainteresowany to służę pomocą i odpowiedzią.

Dodatkowo może ktoś ma inny pomysł?

Znajdź na forum majsterkowo.pl wątek zatytułowany "jak wyjść z nieskończonej pętli" (przepraszam, ale na telefonie nie bardzo mam jak podać bezpośredni link). Bardzo podobny problem.

Znalazłem ten post, lecz tam z tego co zrozumiałem wszystko wykonują poprzez piny czyli fizycznie chcą przerywać. Ja potrzebuję to wykonywać poprzez LAN, czyli wykorzystać czytanie znaków wejściowych.

Prosta sprawa: nie da się wyjść z nieskończonej pętli. Jeśli w jakikolwiek sposób jesteś w stanie ją przerwać to pętla nie jest nieskończona.

Cały pic polega na tym, żeby zamiast implementować nieskończone pętle i szukać sposobu jak je skończyć - po prostu ich nie robić.

Już to gdzieś słyszałem 🙂

Jestem jeszcze szczyl w programowaniu i dlatego jeszcze może nie potrafię wdrożyć w życie tej zasady. 😎

Nie wiem jak zaimplementowałeś ten timer, ale to właśnie tak powinno się robić. Żadne tam pętle w w których mrugasz diodami i sprawdzasz jakieś warunki między delay'ami - to dziecinada. Mam nadzieję, że stworzyłeś osobny proces mrugania, gdzie zezwalasz jedynie na błyski przez ustawienie jakiejś globalnej flagi. Wtedy w dowolnej chwili możesz to załączyć lub wyłączyć i nie przejmować się odliczaniem czasu w pętli głównej.

Zrobiłem coś takiego, pewnie dałoby się to jeszcze uprościć, ale ...

Biblioteka w załaczniku

#include <Timers.h>

 Timers <2> miganie;

void setup() {
 ...
 miganie.attach (0, 0, redON);
 miganie.attach (1, 0, redOFF);

}

void redON() {
 digitalWrite (A3, HIGH);
}

void redOFF() {
 digitalWrite (A3, LOW);
}

void loop() {
 miganie.process();
 EthernetClient client = server.available();

 if (client) {
   txt = client.read();
   daneEth += txt;
     if (txt == '\n') {
       daneEth = "";
     }
     if (daneEth == "blinkRedOFF") {
       miganie.updateInterval(0,0);
       miganie.updateInterval(1,0);
       digitalWrite (A5, LOW);
     }
     if (daneEth == "blinkRedON") {
       miganie.updateInterval(0,500);
       miganie.updateInterval(1,1001);
     }

}

Timers.zip

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...