Skocz do zawartości

Zatrzymenie pętli


Krisk

Pomocna odpowiedź

Szukałem, myślałem, ale nie znalazłem rozwiązania.

Mam do wykonania jakiś pomiar, uruchamiam go po otrzymaniu Serial Read- czyli np dokonywanie pomiaru w kółko co 1s, jak zrobić, aby program się zatrzymał po otrzymaniu innego serial read?

 

Link do komentarza
Share on other sites

pseudokod




while(1)
{
 char c = serial.read(); // czy coś tam w arduino
 if( c == 'a')
  {
 	pomiar();   
  }
}  

 

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Wtedy pomiar jest wykonywany tylko 1 raz po wpisaniu 'a'

while(1)
{

char c = Serial.read();
if(c == 'a')
  
{

  delay(1000); // To makeit light on 

 uint16_t r, g, b, c, colorTemp, lux;

  tcs.getRawData(&r, &g, &b, &c);
  // colorTemp = tcs.calculateColorTemperature(r, g, b);
  colorTemp = tcs.calculateColorTemperature_dn40(r, g, b, c);
  lux = tcs.calculateLux(r, g, b);

  Serial.print("Color Temp: "); Serial.print(colorTemp, DEC); Serial.print(" K - ");
  Serial.print("Lux: "); Serial.print(lux, DEC); Serial.print(" - ");
  Serial.print("R: "); Serial.print(r, DEC); Serial.print(" ");
  Serial.print("G: "); Serial.print(g, DEC); Serial.print(" ");
  Serial.print("B: "); Serial.print(b, DEC); Serial.print(" ");
  Serial.print("C: "); Serial.print(c, DEC); Serial.print(" ");
  Serial.println(" ");
  delay(500);

 }
}
}

 

Link do komentarza
Share on other sites

Nie wiem czy o to chodziło, ale:

void loop() {
  static char c='x'; // static żeby pamiętać co było poprzednio
  if (Serial.available()) { // ktoś coś nacisnął
    c=Serial.read(); // ciekawe co nacisnął
    while (Serial.available()) Serial.read(); // czyścimy bufor serial
  }

// i dalej jak było

  if (c == 'a') { 

A twoje while(1) to po co? Przecież loop i tak się w kółko kręci...

  • Lubię! 1
Link do komentarza
Share on other sites

albo z dodatkową flagą 

bool flaga_pomiar = false;

if(c == 'a') flaga_pomiar = true;
if(c == 'x') flaga_pomiar = false;
// i potem
if(flaga_pomiar == true)
{
  ....
  }

 

Link do komentarza
Share on other sites

Jak zatrzymasz program, to już nic więcej nie zrobisz, zadziała tylko przycisk reset. Nawet jak program nie pokazuje żadnej aktywności, to dlatego, że pomija się wykonywanie rzeczy sygnalizujące jakąś aktywność - liczenie, czytanie czy miganie. 

Taki stan z while(1) nie różniłby się niczym od nieprzywidzianego zawieszenia się programu. Loop powinien wykonywać się wciąż i najszybciej jak to możliwe, więc po prostu pomiń wykonywanie pomiarów, gdy ich nie chcesz.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.