Tengo una aplicación que debe recoger datos en tiempo real de un gps (Receptor GPS Gtop G33 NMEA-0183) a desarrollar en Visual Studio 2008. Uso un objeto serialPort para comunicarme mediante el puerto COM4 (Bluetooth) con el GPS.
Bien, mi objetivo es cada un cierto tiempo determinado conocer las coordenadas enviadas ACTUALES.
Para ello uso el evento serialPort1_DataReceived, en él leo una linea del puerto utilizando el método "serialPort1.ReadLine()" e identifico si se trata de una sentencia GGA, ya que es la sentencia en la cuál se me indica la latitud y longitud, y guardo estos datos en una variable del programa Coord, estructura creada por mí para representar una coordenada con latitud y longitud.
Pues como he dicho cada cierto tiempo voy añadiendo a una "lista de coordenadas" la variable Coord (utilizando un timer), que por lo que alcanzo a entender sería la última coordenada leída por el GPS.
Pues el problema está que no me añade en la ruta el ÚLTIMO elemento, me explico:
Yo empiezo una ruta, activo el GPS y abro el puerto del serialPort, y empiezo a tomar datos cada 4 segundos. Acabo la ruta, cierro el puerto e imprimo en un documento .xml los datos de la lista de coordenadas. Pues en esa lista no me recoge ni la cuarta parte de puntos de esa ruta!!
me recoge un montón de puntos del sitio inicial y luego muy poco a poco va siguiendo la ruta y se para a menos de la mitad...
el problema está claro que está a la hora de añadir datos a la lista de ruta, es como si la variable nuevopunto tuviera memoria y me fuera añadiendo a la ruta TODOS los puntos recogidos por el GPS y no el último como quiero yo añadir. No encuentro ninguna explicación a esto.
Aquí el código del evento "Datos recibidos por el GPS"
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
string aux1 = "";
if (serialPort1.IsOpen == true)
{
string aux = serialPort1.ReadLine();
// Detectamos que es una trama GGA
foreach (char c in aux)
{
if (c != ',')
{
aux1 += c.ToString();
}
else
{
break;
}
}
if (aux1 == "$GPGGA") // Esto nos indica que se trata de una trama GGA
{
TrataGGA(aux); // Aquí desmenuzo la trama obteniendo la longitud y latitud actuales y la guardo en una variable global coordenada
}
}
}
private void TrataGGA(string trama)
{
sexagesimal lat_new
= new sexagesimal
(g1, m1, s1
); // sexagesimal es una clase con dos enteros y un double (grados, minutos y segundos) sexagesimal lon_new
= new sexagesimal
(g2, m2, s2
); nuevopunto
= new Coord
(lat_new, lon_new
); // aqui sobreescribo la variable "Coord nuevopunto" }
Aquí el código del evento del timer.
private void timer1_Tick(object sender, EventArgs e)
{
ruta.Add(nuevopunto); // nuevopunto es una variable Coord y ruta una List<Coord>
// Se supone que nuevopunto tendría recogido el último valor latitud y longitud pero no es así...
}
Y aquí los eventos de los botones:
private void button1_Click(object sender, EventArgs e) // Aquí el botón que empieza la ruta
{
if (serialPort1.IsOpen == false)
{
serialPort1.Open();
timer1.Interval=Convert.ToInt32(textBox1.Text)*1000; // Capturo de un textBox los segundos de intervalo de recogida de cada punto
timer1.Enabled = true; // Activo el timer.
MessageBox.Show("Puerto Abierto", "Operación iniciada");
}
}
private void button2_Click(object sender, EventArgs e)
{
if (serialPort1.IsOpen == true)
{
serialPort1.Close();
timer1.Enabled = false;
MessageBox.Show("Puerto Cerrado", "Operación finalizada");
}
GuardaXml(); // Aquí vuelvo los datos de la estructura ruta en un documento xml
}
Bueno espero no haberme extendido demasiado gracias de antemano por las respuestas.