[Programmation] Decodage trame NMEA d'un GPS
Répondre à la discussion
Affichage des résultats 1 à 23 sur 23

Decodage trame NMEA d'un GPS



  1. #1
    adipie

    Decodage trame NMEA d'un GPS


    ------

    Bonjour,
    Je cherche à parser la trame NMEA suivante :
    $GPRMC, ------------*15 CR LF (15 étant le cheksum)
    J’arrive à récupérer ce qui se trouve entre $ et * avec le code MikroBasic suivant :
    Le code qui fonctionne:
    Code:
    Delim as string[1]                  ' déclaration du délimiteur
      
      Delim[0] = chr(42)                  ' ASCI 42 = *
      Delim[1] = ""                          ' Zéro terminal
      if (UART1_Data_Ready() = 1) then
       UART1_Read_Text(Rec, Delim, 255)   ' La trame entre $ et * se trouve dans Rec
      end if
    Comme le cheksum se trouve après le caractère *, je souhaite maintenant récupérer ce qui se trouve entre * et CR, mais le code suivant fige le programme du PIC.

    Code:
    Delim as string[1]                  ' déclaration du délimiteur
      
      Delim[0] = chr(13)                  ' ASCI 13 = CR
      Delim[1] = ""                       ' Zéro terminal
      if (UART1_Data_Ready() = 1) then
       UART1_Read_Text(Rec, Delim, 255)   ' Ceci ne fonctionne pas
      end if
    Qui a une idée ?
    Exemple de trame reçue:
    Nom : TrameGprmc.JPG
Affichages : 635
Taille : 10,2 Ko

    -----
    Dernière modification par adipie ; 24/12/2016 à 13h57.

  2. #2
    Jack
    Modérateur

    Re : Decodage trame NMEA d'un GPS

    je ne connais pas la syntaxe de ton basic, mais j'ai l'impression que le problème du délimiteur qui reste l'étoile puisque tu founis toujours le même paramètre à la fonction de lecture du port série.

  3. #3
    Jack
    Modérateur

    Re : Decodage trame NMEA d'un GPS

    Pourquoi ne pas lire la trame complète dans un tableau et la décoder tranquillement ensuite?

  4. #4
    adipie

    Re : Decodage trame NMEA d'un GPS

    Bonjour, je ne comprend pas ta réponse.
    Dans l'exemple qui fonctionne Delim[0] = chr(42) et dans l'autre qui ne fonctionne pas j'ai Deiim[0] = 13
    42 = * et 13 = CR

  5. A voir en vidéo sur Futura
  6. #5
    adipie

    Re : Decodage trame NMEA d'un GPS

    C'est exactement ce que je cherche à faire en stockant de $ à CR alors que si je stocke de $ à * ça fonctionne mais je n'ai pas le cheksum.

  7. #6
    Jack
    Modérateur

    Re : Decodage trame NMEA d'un GPS

    D'accord, je n'avais pas bien compris comment agissait le délimiteur
    J'ai regardé la doc concernant le délimiteur:
    Delimiter: sequence of characters that identifies the end of a received string
    Or ta séquence est constituée de 13 00 au lieu de 13 10
    As-tu essayé avec
    Code:
      Delim[0] = chr(13)                  ' ASCII 13 = CR
      Delim[1] = chr(10)                  ' ASCII 10 = LF

  8. #7
    adipie

    Re : Decodage trame NMEA d'un GPS

    Citation Envoyé par Jack Voir le message
    D'accord, je n'avais pas bien compris comment agissait le délimiteur
    J'ai regardé la doc concernant le délimiteur: Or ta séquence est constituée de 13 00 au lieu de 13 10
    As-tu essayé avec
    Code:
      Delim[0] = chr(13)                  ' ASCII 13 = CR
      Delim[1] = chr(10)                  ' ASCII 10 = LF
    Merci pour votre réponse, j'ai essayé mais ça ne fonctionne pas.
    Dans la description de l'instruction Uart1_Write_Text, le délimiteur doit être du type Strings soit String[0] = char et String[1] = "" (zéro terminal).
    Je vais ranger tout cela et reprendre après les fêtes, sauf si j'ai une idée lumineuse avant.
    Je vous souhaite un joyeux noël.

  9. #8
    paulfjujo

    Re : Decodage trame NMEA d'un GPS

    bonsoir,


    la syntaxe ne serait pas, comme en C
    Delim[0] = 13 ' ASCII 13 = CR
    Delim[1] = 10 ' ASCII 10 = LF
    Delim[2]=0 // delim est un string ...

    trame typique
    Code:
    07:22:51  
              0000  24 47 50 47 47 41 2C 30 37 32 32 35 31 2E 30 30  $GPGGA,072251.00
              0010  2C 34 35 35 30 2E 37 32 34 31 38 2C 4E 2C 30 30  ,4550.72418,N,00
              0020  35 30 32 2E 33 32 36 36 38 2C 45 2C 31 2C 30 36  502.32668,E,1,06
              0030  2C 31 2E 31 38 2C 31 39 39 2E 36 2C 4D 2C 34 37  ,1.18,199.6,M,47
              0040  2E 33 2C 4D 2C 2C 2A 35 34 0D 0A                 .3,M,,*54...

  10. #9
    adipie

    Re : Decodage trame NMEA d'un GPS

    Citation Envoyé par paulfjujo Voir le message
    bonsoir,


    la syntaxe ne serait pas, comme en C
    Delim[0] = 13 ' ASCII 13 = CR
    Delim[1] = 10 ' ASCII 10 = LF
    Delim[2]=0 // delim est un string ...

    trame typique
    Code:
    07:22:51  
              0000  24 47 50 47 47 41 2C 30 37 32 32 35 31 2E 30 30  $GPGGA,072251.00
              0010  2C 34 35 35 30 2E 37 32 34 31 38 2C 4E 2C 30 30  ,4550.72418,N,00
              0020  35 30 32 2E 33 32 36 36 38 2C 45 2C 31 2C 30 36  502.32668,E,1,06
              0030  2C 31 2E 31 38 2C 31 39 39 2E 36 2C 4D 2C 34 37  ,1.18,199.6,M,47
              0040  2E 33 2C 4D 2C 2C 2A 35 34 0D 0A                 .3,M,,*54...
    Merci pour ton aide, je viens d'essayer sans résultat.
    J'arrive pourtant à délimiter si j'utilise le caractère * + zéro terminal
    Je te souhaite un joyeux noël.

  11. #10
    paulfjujo

    Re : Decodage trame NMEA d'un GPS

    Code:
    Delim as string[1]
    ne soit pas radin, mets au moins 2 voir 3 ...

    Code:
    Delim as string[3]
    Delim[0] = 13 ' ASCII 13 = CR
    Delim[1]=0  '  terminator
    Dernière modification par paulfjujo ; 24/12/2016 à 19h45.

  12. #11
    adipie

    Re : Decodage trame NMEA d'un GPS

    Rien à faire, ça ne fonctionne pas.
    Ce que ne comprend pas, c'est pourquoi ça fonctionne avec le caractère * (asci 42).

  13. #12
    Jack
    Modérateur

    Re : Decodage trame NMEA d'un GPS

    Allez, avec la bonne séquence ET la bonne taille de tableau:

    Delim as string[3]
    Delim[0] = 13 ' ASCII 13 = CR
    Delim[1] = 10 ' ASCII 10 = LF
    Delim[2]=0

  14. #13
    adipie

    Re : Decodage trame NMEA d'un GPS

    Citation Envoyé par Jack Voir le message
    Allez, avec la bonne séquence ET la bonne taille de tableau:

    Delim as string[3]
    Delim[0] = 13 ' ASCII 13 = CR
    Delim[1] = 10 ' ASCII 10 = LF
    Delim[2]=0
    Désolé mais ça ne fonctionne pas.

  15. #14
    paulfjujo

    Re : Decodage trame NMEA d'un GPS

    bonjour à tous,


    Ton GPS envoie-t-il QUE la trame $GPRMC ?
    ou en plus $GPGGA ?

    j'ai galéré un moment avec ce probleme , sachant qu'il y a un CR LF a chaque fin de trame.
    mais une * que sur $GPRMC

  16. #15
    adipie

    Re : Decodage trame NMEA d'un GPS

    Bonjour,
    Il envoi un paquet de 8 trames toutes les secondes.
    Si j'utilise le delimiteur *, j'arrive à afficher l'heure, la latitude, la longitude et la date de la trame GPRMC sur l'écran LCD sur la carte EasyPic 5
    Je pense que la solution c'est d'utiliser Uart1_Read et analyser chaque byte reçu.

  17. #16
    adipie

    Re : Decodage trame NMEA d'un GPS

    Bonjour, voila le problème résolu en lisant les trames byte à byte avec Uart1_Read.Nom : TrameGps.JPG
Affichages : 704
Taille : 32,9 Ko

  18. #17
    adipie

    Re : Decodage trame NMEA d'un GPS

    D'après Mikroelektronika ceci devrait fonctionner.
    Code:
    Delim as string[1]                 
      Delim[0] = chr(13)                 
      Delim[1] = ""                     
      if (UART1_Data_Ready() = 1) then
       UART1_Read_Text(Rec, Delim, 255)   
      end if
    Mais ce n'est pas le cas.

  19. #18
    Thetimax

    Re : Decodage trame NMEA d'un GPS

    Bonjour,

    Dans un des exemple de Mikroelektronika concernant l'utilisation du GPS, ils utilisent la fonction "strstr" qui retourne un pointeur.
    Par exemple:

    string = strstr(txt,"$GPRMC");

    Le premier caractère pointé par "string" sera le symbole "$" de la trame GPRMC, tout les caractères suivants seront la suite de cette même trame.
    Une fois que tu a "ressorti" cette trame, tu peux reproduire cette fonction en remplaçant "$GPRMC" par "*"

    A mon avis ton programme fige car la longueur de la trame n'est pas constante, par exemple, si tu cherche a la lire alors que le module n'est pas initialisé, il envoie des trames incomplètes entre les virgules.

    Tu peux trouver dans l'aide de MikroE la fonction "strstr" et ici le programme exemple d'utilisation d'un module GPS :
    http://libstock.mikroe.com/projects/...-click-example

    Bonne journée et joyeuses fêtes a tous ...
    Rien ne se perd, rien ne se crée, tout se transforme...

  20. #19
    adipie

    Re : Decodage trame NMEA d'un GPS

    Bonjour, j'arrive à lire toutes les trames de différente tailles entre $ et * et j'utilise strstr pour isoler la trame GPRMC.en utilisant le délimiteur "*".
    Mais c'est en voulant utiliser le délimiteur CR ou LF ou les deux que ça coince et comme le cheksum se trouve après "*" je suis cuit.
    Entre temps j'ai réglé le problème en lisant les trames byte par byte.

  21. #20
    adipie

    Re : Decodage trame NMEA d'un GPS

    sachant qu'il y a un CR LF a chaque fin de trame.
    mais une * que sur $GPRMC
    Bonjour, j'utilise un récepteur GP 735 suivant: https://cdn.sparkfun.com/datasheets/...35T-150203.pdf
    Il envoi des paquets de 7 trames toute les secondes.
    Le signe "*" précède le cheksum de chaque trame et pas seulement de la trame GPRMC.
    Nom : CopieTrameGps.JPG
Affichages : 1039
Taille : 81,4 Ko

  22. #21
    paulfjujo

    Re : Decodage trame NMEA d'un GPS

    bonsoir,


    Ce GPS semble admettre des message Ublox

    Voir si avec le logiciel Ublox , tu peux configurer celui ci pour ne recevoir que la trame $GPRMC ,
    sur le mien je n'ai conserver que les 2 trames $GPGGA et $ GPRMC
    et utilise les interruptions pour separer / isoler les 2 trames

  23. #22
    adipie

    Re : Decodage trame NMEA d'un GPS

    Bonjour, je n'ai pas pensé à cette solution, je vais essayer.

  24. #23
    adipie

    Re : Decodage trame NMEA d'un GPS

    Citation Envoyé par paulfjujo Voir le message
    bonsoir,


    Ce GPS semble admettre des message Ublox

    Voir si avec le logiciel Ublox , tu peux configurer celui ci pour ne recevoir que la trame $GPRMC ,
    sur le mien je n'ai conserver que les 2 trames $GPGGA et $ GPRMC
    et utilise les interruptions pour separer / isoler les 2 trames
    Bonjour,
    J'ai essayé de limiter à 1 trame avec le logiciel UBLOX, mais je n'est pas trouvé comment faire.
    J'ai réglé le problème par soft dans mon programme.
    Encore merci pour ton aide.

Discussions similaires

  1. décodage d'une trame IR par pic
    Par inviteb5b0fd5b dans le forum Électronique
    Réponses: 9
    Dernier message: 03/11/2013, 23h05
  2. trame Nmea usb
    Par invite487667bf dans le forum Électronique
    Réponses: 1
    Dernier message: 26/04/2013, 09h32
  3. Décodage d'une trame RC5
    Par inviteafa9cf6f dans le forum Électronique
    Réponses: 6
    Dernier message: 19/12/2012, 09h48
  4. récupérer trame nmea via GPRS
    Par invite2e695733 dans le forum Programmation et langages, Algorithmique
    Réponses: 0
    Dernier message: 01/03/2012, 14h27
  5. décodage trame RC5
    Par invite4aa0e93b dans le forum Électronique
    Réponses: 2
    Dernier message: 08/01/2004, 21h09
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...