TODOPIC

Otros Microcontroladores / Dispositivos programables => Arduino => Mensaje iniciado por: aitorsp en 16 de Junio de 2012, 12:15:49

Título: No me captura las tramas GPGGA
Publicado por: aitorsp en 16 de Junio de 2012, 12:15:49
Hola:

Este codigo lo encontré en internet. Lo he modificado un poco para capturar tramas GPGGA de un GPS SKM53 de Skylab. Lo que hago es leer desde Serial2 e imprimo las tramas atraves del COM interno del arduino.No consigo capturarlas. Pongo el codigo por si descubris algun fallo. Lo llevo revisando toda la tarde y nada.

Código: C++
  1. // Librerias a utilizar
  2. // variables utilizadas
  3. byte byteGPS = 0; // Aqui se guardan los bytes del GPS que van al array
  4. int i=0; //Acumulador
  5. int Estado=0; // Estado de la conexion
  6. char TramaGPG[100]; // Array para guardar los bytes leidos
  7. char *pch; // puntero tipo char
  8. char *GGA[15]; // Array de punteros tipo char
  9. int sat = 0; // numero de satelites
  10.  
  11. // Setup del programa
  12.  
  13. void setup(){
  14.   Serial.begin(9600);
  15.   Serial2.begin(9600);
  16. }
  17.  
  18. // loop del programa
  19.  
  20. void loop(){
  21. Serial.println("Capturando Tramas GPGGA...");
  22. delay(2000);
  23. // Lectura del puerto serie
  24. memset(TramaGPG,0,sizeof(TramaGPG)); // Inicializa a cero la cadena eliminando
  25. //restos anteriores
  26. byteGPS = 0;
  27. byteGPS = Serial2.read(); // leemos el byte del puerto serie
  28.  
  29. // buscamos la cadena adecuada para empezar a guardar la trama
  30. while(byteGPS != '$'){
  31.   byteGPS = Serial2.read();  
  32.   }
  33. // Una vez localizada la cadena empezamos a guardar en el array
  34. i = 1;
  35. TramaGPG[0]='$';
  36.  
  37. // Llenamos el array hasta el fin de cadena que es '*'
  38.  
  39. while(byteGPS != '*'){
  40.   byteGPS = Serial2.read();
  41.   TramaGPG[i] = byteGPS;
  42.   i++;
  43.   }
  44. TramaGPG[i] = '\0'; // Caracter de fin de linea
  45. // Llamamos a la funcion cadena() para manipularla
  46. cadena();
  47. }
  48.  
  49. // Funcion que identifica a la trama para sacar los datos de la
  50. // latitud,longitud, etc.
  51.  
  52. void cadena(){
  53. i = 0;
  54. memset(GGA,0,sizeof(GGA)); // limpiamos el array GGA introduciendo ceros
  55. pch=strtok(TramaGPG,","); // Troceamos la cadena en el array TramaGPG
  56. //  por las comas y el primer intervalo lo guardamos en pch que es
  57. // un puntero a char.
  58. // Analizamos el intervalo para ver si es la que necesitamos. Si es
  59. // la correcta continuamos.
  60. if(strcmp(pch,"$GPGGA")==0);
  61.   {
  62.     while(pch != NULL){
  63.       pch = strtok(NULL,","); // pasamos al siguiente intervalo cortado
  64.      // de la cadena
  65.      GGA[i]=pch; // Guardamos el valor de pch en el array GGA
  66.      i++;
  67.     }
  68. representa(GGA,"$GPGGA");
  69. }
  70. }
  71.  
  72. // Funcion para mostrar los datos por serial o por LCD.
  73. // Se le pasan dos parámetros, el array de chars y la cadena
  74. // a comparar.
  75.  
  76. void representa(char **GGAPrint,char *trama){
  77. Estado = atoi(GGAPrint[5]);
  78. sat = atoi(GGAPrint[6]);
  79. if(trama=="$GPGGA && Estado==1"){
  80.   Serial.println("");
  81.   Serial.println("---------------------------------------------------");
  82.   Serial.print("Hora UTC ->");
  83.   Serial.println(GGAPrint[0]);
  84. }
  85. }
Título: Re: No me captura las tramas GPGGA
Publicado por: Suky en 16 de Junio de 2012, 12:26:33
Tu GPS por defecto tiene el baud rate en 9600 ?
Título: Re: No me captura las tramas GPGGA
Publicado por: aitorsp en 16 de Junio de 2012, 12:30:36
Tu GPS por defecto tiene el baud rate en 9600 ?

Ummm, si, el SKM53 funciona por defecto a 9600.

Estaba pensando que quizas no esté localizando satelites ya que vivo en una zona entre edificios. tendria que salir hasta campo abierto para probarlo del todo. Sin embargo donde lo he probado, el gps TOMTOM si que engancha bien la señal por lo que el Skylab tambien tendria que funcionar.
Título: Re: No me captura las tramas GPGGA
Publicado por: Suky en 16 de Junio de 2012, 12:34:55
Igual las tramas te las manda, sin datos pero las envia.
Título: Re: No me captura las tramas GPGGA
Publicado por: aitorsp en 16 de Junio de 2012, 12:36:24
Igual las tramas te las manda, sin datos pero las envia.

Si, efectivamente, tienes razon pero entonces al menos deberia visualizar algo en el serial monitor no?. No visualiza mas que el mensaje inicial.
Título: Re: No me captura las tramas GPGGA
Publicado por: Suky en 16 de Junio de 2012, 13:23:23
No tienes manera de conectar el GPS a la PC? Para ver que funcione. Luego también podes debuggear y ver donde se queda clavado. Seguramente esperando un '$'  :tongue:
Título: Re: No me captura las tramas GPGGA
Publicado por: aitorsp en 16 de Junio de 2012, 14:01:58
No tienes manera de conectar el GPS a la PC? Para ver que funcione. Luego también podes debuggear y ver donde se queda clavado. Seguramente esperando un '$'  :tongue:

He probado con un codigo mas simple, leyendo en bruto lo que llega por el Serial2 y si que llegan tramas pero incompletas, quizas porque no tengo cobertura.

Del codigo que he puesto arriba esta correcto?. Si es asi ya lo probare en campo abierto a ver que captura.
Título: Re: No me captura las tramas GPGGA
Publicado por: aitorsp en 17 de Junio de 2012, 06:14:35
He detectado en la linea 60 del codigo esto.

if(strcmp(pch,"$GPGGA")==0);
 {
   while(pch != NULL){
     pch = strtok(NULL,","); // pasamos al siguiente intervalo cortado
    // de la cadena
    GGA=pch; // Guardamos el valor de pch en el array GGA
    i++;
   }
representa(GGA,"$GPGGA");
}

Ese punto y coma en el if esta mal
Título: Re: No me captura las tramas GPGGA
Publicado por: aitorsp en 18 de Junio de 2012, 15:31:37
Creo que hay algun problema con la lectura Serial en la version 023 de Arduino para el Mega, ahi puede estar el fallo con este codigo.