Go Down

Topic: While loop infinito (Read 161 times) previous topic - next topic

Ivan_L5

Hola a todos.

Este es mi primer post y espero me puedan ayudar.
Estoy realizando un proyecto que consiste en la obtencion de datos de un gps Ublox NEO 6M y enviar estos datos por medio de xbee, al enviar un caracter de inicio. Para la obtencion de datos del gps uso la libreria TinyGPS++.

He logrado que al enviar la letra 's' por el modulo xbee, se inicie la obtencion de datos del gps, ahora lo que requiero es que una vez iniciada la secuencia de obtencion de datos, al enviar otro caracter por xbee, una letra 'a' por ejemplo, ahora se active un led.

Mi problema es que no consigo que al enviar la letra 'a' se encienda el led.

La secuencia de obtencion de datos del gps la realizo con un ciclo do while infinito para que sea cnstante la obtencion y envio de los datos y pienso que dentro de este ciclo do while debe ir otra condicion para que al recibir ahora la letra 'a' se encienda el led pero no he logrado hacer eso. Adjunto mi codigo, espero que si alguien ve algun error en mi logica me pueda ayudar a resolverlo.
Muchas gracias a todos!



CÓDIGO:

#include <TinyGPS++.h>
#include <SoftwareSerial.h>

static const int RXPin = 4, TXPin = 3; //Declaración de los pines rx y tx para comunicacion serial del gps
static const uint32_t GPSBaud = 9600;  //Declaración de velocidad de comunicacion para gps

// Declaración del gps
TinyGPSPlus gps;

// Declaracion de los pines de comunicacion serial para el gps
SoftwareSerial ss(RXPin, TXPin);

SoftwareSerial xb(6,5); //Declaración de los pines de comunicación serial para el xbee.

char inicio; //Caracter a enviar para iniciar con la transmisión de datos.
int val=0;  //Valor a cambiar para crear el ciclo infinito while e imprimir constantemente los datos del gps

void setup()
{
  xb.begin(9600);
  ss.begin(GPSBaud);
  pinMode(9,OUTPUT);
}

void loop()
{
  xb.listen();
  if(xb.available()>0)
  {
    char inicio = xb.read(); //Se lee el caracter enviado por el xbee

    if(inicio == 's')//Si el caracter es 's' se entra en el ciclo do whie
    {
      val=1; //Se cambia el valor de val a 1 para que se inicie el ciclo infinto y así mandar constante mente los valores del gps

      do{   
  printInt(gps.satellites.value(),gps.satellites.isValid(), 5);xb.print(",");
  printFloat(gps.location.lat(),gps.location.isValid(),11,6);xb.print(",");
  printFloat(gps.location.lng(),gps.location.isValid(),12,6);xb.print(",");
  printDateTime(gps.date,gps.time);xb.print(",");
  printFloat(gps.altitude.meters(),gps.altitude.isValid(),7,2);xb.print(",");
  printFloat(gps.speed.mps(),gps.speed.isValid(),6,2);xb.print("&");
 
  xb.println();
  smartDelay(250);

  if (inicio=='a')
  {
    digitalWrite(9,HIGH);
    }

  if (millis() > 5000 && gps.charsProcessed() < 10)
    xb.println(F("No GPS data received: check wiring"));
      }

      while(val=1); //Condición a evaluar que siempre es verdadera y el ciclo no para
 }
 }
   
  }


 //Funciones creadas para la obtención de los datos del gps

void smartDelay(unsigned long ms)
{
  unsigned long start = millis();

  ss.listen();
  do
  {
    while (ss.available())
      gps.encode(ss.read());
  } while (millis() - start < ms);
}

 void printFloat(float val, bool valid, int len, int prec)
{
  if (!valid)
  {
    while (len-- > 1)
      xb.print('*');
    xb.print(' ');
  }
  else
  {
    xb.print(val, prec);
    int vi = abs((int)val);
    int flen = prec + (val < 0.0 ? 2 : 1); // . and -
    flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
    for (int i=flen; i<len; ++i)
      xb.print(' ');
  }
  smartDelay(0);
}

 void printInt(unsigned long val, bool valid, int len)
{
  char sz[32] = "*****************";
  if (valid)
    sprintf(sz, "%ld", val);
  sz[len] = 0;
  for (int i=strlen(sz); i<len; ++i)
    sz = ' ';
  if (len > 0)
    sz[len-1] = ' ';
  xb.print(sz);
  smartDelay(0);
}

 void printDateTime(TinyGPSDate &d, TinyGPSTime &t)
{
  if (!d.isValid())
  {
    xb.print(F("********** "));
  }
  else
  {
    char sz[32];
    sprintf(sz, "%02d/%02d/%02d ,", d.month(), d.day(), d.year());
    xb.print(sz);
  }
 
  if (!t.isValid())
  {
    xb.print(F("******** "));
  }
  else
  {
    char sz[32];
    sprintf(sz, "%02d:%02d:%02d ", t.hour(), t.minute(), t.second());
    xb.print(sz);
  }

 
  smartDelay(0);
}

 void printStr(const char *str, int len)
{
  int slen = strlen(str);
  for (int i=0; i<len; ++i)
    xb.print(i<slen ? str : ' ');
  smartDelay(0);
}

codlink

Why did you post this same issue 3 times?
http://forum.arduino.cc/index.php?topic=381207.msg2628374#msg2628374
http://forum.arduino.cc/index.php?topic=381200.msg2628332#msg2628332

If you would have scrolled down a little farther, you would have found a forum in your language.  And please use code tags.
//LiNK

surbyte

Bueno te han sacado a las patadas del foro en inglés.
Sacrilegio allá es escribir en español.

Sacrilegio acá es postear cosas sin leer las normas del foro.
Leelas y luego edita tu post usando tags.
Vas al post#1, editas, y luego click en </> muy facil.

Ahora tu consulta
   
Code: [Select]
     while(val=1); //Condición a evaluar que siempre es verdadera y el ciclo no para

Hace que cuando caes ahi, no salga mas.
De todas formas veo cierto caos en la forma en que presentas el código.
Ejemplo.
Tienes un
Code: [Select]
if (inicio == 's')

y dentro 
Code: [Select]
if (inicio == 'a')


surbyte

#3
Feb 22, 2016, 10:43 pm Last Edit: Feb 22, 2016, 10:46 pm by surbyte
Publico la respuesta de PaulS porque pedí que borren el post duplicado.

Quote
Quote from: PaulS Mon Feb 22 2016 15:19:49 GMT-0300 (Hora estándar de Argentina)

No, you don't. loop() is already an infinite loop.

smartDelay() is a stupid function. Get rid of it. Do it right.

Code: [Select]
void loop()
{
  while (ss.available())
  {
     if(gps.encode(ss.read())
     {
        // A complete sentence was received. Do something useful with the data
     }
  }

  // Whatever else you need to do goes here
}


There is no such thing as an if loop. An if statement does not loop.

You are beating a dead horse trying to listen to two different software serial ports. Give it up now. That horse isn't going anywhere.

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy