IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Extraire trames d'un GPS


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Extraire trames d'un GPS
    Bonjour!
    J'aimerais avoir votre avis.
    Je dois faire un code en C afin de pouvoir arriver a extraire les données de la trame RMC, notamment la lattitude, la longitude ainsi que les points cardinaux et éventuellement l'heure.
    Ainsi j'avais déjà trouver cela pour l'heure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #include <stdio.h>
    #include <string.h>
    #include<stdlib.h>
     
    char * convert(char* chaine) 
    { 
     
        double f = atof(chaine);
     
        int deg,min; double sec;
     
     
        deg = (int)(f / 100.0);
     
     
        min = (int)(f - (deg * 100.0));
     
     
        sec = 60.0*(f - (deg*100.0) - min);
     
        char *s = calloc(14,sizeof(char));
     
     
        printf(s,"%3d%c%2d'%5.3f",deg,0xF8,min,sec);
     
        return (s); 
     
    }
    d'après ce que j'ai compris ce serait le même procédé pour le reste mais je n'y arrive vraiment pas .
    Pouvez-vous m'aider SVP ?

  2. #2
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Bonsoir pour nous aider à t'aider tu aurais pu nous dire de quoi est composée une trame RMC, comment tu la lis etc. Ça m'aurait évité d'avoir à chercher sur wikipedia. Donc j'y apprends que l'heure est stockée au format hhmmss.sss, et les coordonnées au format dddmm.mmmm pour la longitude et ddmm.mmmm pour la latitude.
    Ton code pour l'«heure» ressemble plus à un code de conversion de coordonnées (dddmm.mmmm vers ddd°mm'ss.sss).

    Voyons ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char * convert(char* chaine)
    Juste un détail, comme chaine ne sera jamais modifiée tu peux en avertir le compilateur en déclarant char* convert(const char *chaine). Un commentaire ne serait pas de trop pour expliquer au lecteur quel est le format attendu de chaîne. On va partir du principe que chaine sera au format dddmm.mmmm ou ddmm.mmmm.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    { 
        double f = atof(chaine);
    La fonction atof n'est pas ta meilleure option, car si la chaine ne contient pas quelque chose qui peut être transformé en réel alors elle renvoie 0.0. Du coup tu ne sais pas en recevant 0.0 s'il s'agit d'une erreur ou de 0.0. C'est pourquoi on lui préfère la fonction strtod. Pour savoir comment l'utiliser tu peux consulter la page man strtod. Je suppose qu'en cas d'erreur ta fonction pourra renvoyer NULL.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        int deg,min; double sec;
        deg = (int)(f / 100.0);
    Je ne suis pas un pro de l'utilisation et du cast de double en int. J'aurai sans doute par excès de zèle forcé l'arrondi par un deg=(int) floor(f / 100.0);. Mais cela reste à vérifier, quoi qu'il en soit cela ne fait pas de mal.
    Ici on récupères bien les degrés : dddmm.mmmm/100.0 = ddd.mmmmmm qui arrondi vers le bas donne ddd. Bingo.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        min = (int)(f - (deg * 100.0));
        sec = 60.0*(f - (deg*100.0) - min);
    Mêmes remarques ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        char *s = calloc(14,sizeof(char));
        printf(s,"%3d%c%2d'%5.3f",deg,0xF8,min,sec);
    printf n'est pas la bonne fonction à utiliser ici. La page man de printf t'indiquera quelle fonction utiliser pour «imprimer» dans une variable.
    Tu alloues la chaine retournée, il faudra penser à la libérer quand tu n'en aura plus besoin. Détail, return n'est pas une fonction donc pas besoin de parenthèses return s; suffit.


    EDIT: Je viens de vérifier mon excès de zèle : c'est n'est pas une bonne idée. En effet la norme précise :
    When a finite value of real floating type is converted to an integer type other than _Bool, the fractional part is discarded (i.e., the value is truncated toward zero).
    Soit exactement ce que tu désires obtenir.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    je tiens a te remercier pour tes précisions.
    Et je suis désolé de ne pas avoir apporter plus d'informations concernant la trame RMC.
    Je vais refaire tout ce la et je te tiens au courant!!

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Bonsoir!
    Je viens a vous encore une fois.
    Finalement je n'ai plus besoin de l'heure. Les infos qui m'interressent sont la longitude et la latitude.

    exemple de trame RMC:

    $GPRMC,225446,A,4916.45,N,12311.12,W,000.5,054.7,191194,020.3,E*68

    les données qui m'interresse sont celles soulignées.
    Et donc pour commencer j'ai fais cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include<stdio.h>
    #include<string.h>
     
    char * tesDonnesGPS = <recuperation des donnees>
     
    int length = 82;
     
    int position = <position de depart>;
     
    char * sousChaine = malloc((length) * sizeof(char));
     
    printf(sousChaine, length+1, "%s", tesDonneesGPS + position);
     
     
    free(sousChaine);
    Suis-je sur la bonne voie SVP ?
    Merci

  5. #5
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Bonsoir,

    non, car tu n'as pas lu la man page de printf
    Regarde snprintf (je suis gentil).

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    d'accord!
    merci

Discussions similaires

  1. Extraire les trames d'une image
    Par ZAYDOUN dans le forum Images
    Réponses: 8
    Dernier message: 03/07/2008, 14h25
  2. Checksum pour Trame GPS et Météo
    Par smeiris dans le forum Langage
    Réponses: 4
    Dernier message: 12/03/2008, 10h58
  3. enregistrement de trame d'un GPS
    Par ffps7 dans le forum C
    Réponses: 1
    Dernier message: 10/05/2007, 10h50
  4. récupérer données GPS (trames NMEA) sur PDA
    Par duguek dans le forum C++
    Réponses: 2
    Dernier message: 14/02/2007, 16h57
  5. Checksum trames GPS
    Par giloutho dans le forum Langage
    Réponses: 3
    Dernier message: 14/02/2005, 12h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo