No consigo salir de un bucle While

Iniciado por mario290386, 1 Agosto 2018, 15:02 PM

0 Miembros y 3 Visitantes están viendo este tema.

mario290386

Hola a todos!! Necesito que alguien me eche una mano con un sencillo programa de Arduino que me está volviendo loco.
He creado un sencillo programa con el que usando el monitor serie voy mandando un 1 o un 2 para imprimir una serie de estados.

Este es el codigo que he realizado de prueba:
int va;
void setup() {
  Serial.begin(9600);
}


void loop() {

  while (Serial.available()== 0){
    Serial.println("OFF");
    delay (400);
    }


 
  if(Serial.available()>0){
     va=Serial.read();



     while(va=='1') {
   
   Serial.println("Modo 1");
   delay (400);
      }
  }

 
  while (va=='2') {
     Serial.println("Modo 2");
     delay (400);
   
    }   
  }





Os resumo lo que hace mi programa:

  Si no se detecta comunicación por el puerto serie se imprime "OFF"
  Si se detecta un "1" por el puerto serie se imprime "Modo 1"
  Si se detecta un "2" por el puerto serie se imprime "Modo 2"


En principio el programa me funciona, el problema lo tengo en el tratamiento de los bucles.
Resulta que si le envío "1" me imprime "Modo 1" pero al enviar un "2" no consigo que me entre al "Modo 2" realmente no sé de qué manera puedo hacerlo, lo he intentado con bucles while o if else e incluso he usado un GOTO para intentar redirigir el programa al otro bucle pero nunca consigo que me cambie al modo 2 una vez que entra en el primer bucle.

No sé de qué manera proceder, y no sé si debería probar con un switch case o interrumpir el programa de alguna manera,
Por favor necesito una mano, solo me falta esta parte para completar la comunicación de forma correcta.

Gracias!!


MAFUS

Sigue el programa:
Cuándo hay un dato entras en el if.
Si has pulsado 1 va valdrá 1.
Entonces entras en el primer while donde la condición es que se repita si va vale 1. Cómo no hay cambio al terminar el bucle va seguirá valiendo 1 y repetirá el bucle de nuevo. Y esto será infinito.
Cambia el valor de va antes de salir del bucle a 0, por ejemplo.

mario290386

Hola MAFUS, gracias por la idea, en efecto al probar lo que me comentas si funciona, el problema que no me sirve ya que necesito que este imprimiendo continuamente "Modo 1" en bucle infinito y al pulsar 2 necesito que este imprimiendo "Modo 2" en bucle infinito y si pulso de nuevo 1 que me imprima "Modo 1" infinitamente, de la manera que me comentas solo me lo imprime una vez.
Asi es como  he colocado la asignacion de "va=0" en el programa:

     while(va=='1') {
   
   Serial.println("Modo 1");
   delay (400);
   va = 0;
      }
  }

  while (va=='2') {
     Serial.println("Modo 2");
     delay (400);
    va = 0;
    }   
  }


MAFUS

Aprovecha el bucle loop. Cambia los whiles por if.
Si hay un dato en puerto serie lo lees en va.
Si va vale 0 imprime "OFF"
Si va vale 1 imprime "Modo 1"
Si va vale 2 imprime "Modo 2"
Esperar 400ms

Prueba esto.

mario290386

Muchas gracias MAFUS, me funciona correctamente ya el programa, lo he solucionado siguiendo tus pasos pero he cambiado los if por la estructura case.
Saludos.