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 :

acquerir une trame nmea rs232(serie)>PIC


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 3
    Points : 1
    Points
    1
    Par défaut acquerir une trame nmea rs232(serie)>PIC
    bonjour, je voudrai savoir comment je pourrai faire pour appartir d'un pin vers un PIC recuperer une trame mnea genre:

    $GPGGA,005417.800,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,,,,0000*34E,,,270102,,*16
    $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*050000,E,0,00,50.0,0.0,M,,,,0000*31
    $GPRMC,005417.800,V,0000.0000,N,00000.

    je voudrai recuperer et traiter que celle qui commence par "$GPGGA".
    le traitement consisterai a "saucissonner" la phrase a chaque ",".
    j'arrive a acquerir des caractères mais pas des phrases complète et bien structurées

    Merci a tous.

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    On n'a aucune info pour toi, on ne sait pas comment c'est connecté, ...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 62
    Points : 65
    Points
    65
    Par défaut
    si je comprend bien ton pic analyse le flux serie pour acquerir juste une ligne de ta trame nmea pour ca faut que tu tests octet par octet ton flux dés que tu as un $ tu cherche si la suite correspond bien a ton debut de ligne et apres faut que tu connnaisses le nombre de virgules comme ca dés que ton prog a passé le nombre de , de ta ligne tu coupes.

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    [MOD : Merci de lire les règles du forum et d'apprendre à utiliser les balises code]

    voici mon programme sous ccs C:
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    #include "C:\Documents and Settings\Pc eXpresse\Bureau\PPE HOME\CSS\test final.h"
    //#include <stdio.h>
     
     
    #define LCD_ENABLE_PIN PIN_A1
    #define LCD_RS_PIN PIN_A3
    #define LCD_RW_PIN PIN_A2
    #define butt PIN_B0
    #define LCD_TYPE 2
    #define OFF 0
    #include <lcd.c>
     
    #use delay (CLOCK=20000000)
    #fuses NOWDT,HS, NOPUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG
    #use rs232(baud=4800,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=GPS,errors)//data from GPS to PIC
    #byte portc=7
     
    int cd;
    char c;
    char buffer[71];
    char gpgga[8]="$GPPGA,";
    unsigned int8 i;
    char k;
    int count=0;
    int TableauCarte;
    char  endChar;
     
    void main ()
    {
     
     
    lcd_init();
    setup_adc_ports(NO_ANALOGS);
    setup_adc(ADC_OFF);
    setup_psp(PSP_DISABLED);
    setup_spi(FALSE);
    setup_wdt(WDT_OFF);
    setup_timer_0(RTCC_INTERNAL);
    setup_timer_1(T1_DISABLED);
    setup_timer_2(T2_DISABLED,0,1);
    setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
     
     
       while ( getc(GPS) != 36 ) // le problème EST Là !!!!!!!!!!!!<<<<<<<
       {
       for (i=0;i<7;i++) //7
         {
         buffer[i]=getc(GPS);
         }
        }
     
    while (buffer[6]==',');
     
    for (i=1; i<=70; i++) //1.70 22.44
    {
         c = getc(GPS);
         buffer[i] = c;
    }
     
     
    printf(lcd_putc,"LAT:\n");
    for (i = 14; i <=24; i++) //16.26  1.20
    {
     
     
     
    printf(lcd_putc,"%c",buffer[i]);
     
    }
     
     
     
    for (i = 26; i <=36; i++)
    {
     
     
    }while(1);
    }
    Comment je dois faire pour recuper que les "$GPGGA"?

    merci

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    alors personne?

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Je ne vois pas quel est ton problème, d'ailleurs, c'est du C, pas du C++, non ?
    Tu connais strcmp ?

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par strygolw
    voici mon programme sous ccs C:
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    #include "C:\Documents and Settings\Pc eXpresse\Bureau\PPE HOME\CSS\test final.h"
    //#include <stdio.h>
     
     
    #define LCD_ENABLE_PIN PIN_A1
    #define LCD_RS_PIN PIN_A3
    #define LCD_RW_PIN PIN_A2
    #define butt PIN_B0
    #define LCD_TYPE 2
    #define OFF 0
    #include <lcd.c>
     
    #use delay (CLOCK=20000000)
    #fuses NOWDT,HS, NOPUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG
    #use rs232(baud=4800,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=GPS,errors)//data from GPS to PIC
    #byte portc=7
     
    int cd;
    char c;
    char buffer[71];
    char gpgga[8]="$GPPGA,";
    unsigned int8 i;
    char k;
    int count=0;
    int TableauCarte;
    char  endChar;
     
    void main ()
    {
     
     
    lcd_init();
    setup_adc_ports(NO_ANALOGS);
    setup_adc(ADC_OFF);
    setup_psp(PSP_DISABLED);
    setup_spi(FALSE);
    setup_wdt(WDT_OFF);
    setup_timer_0(RTCC_INTERNAL);
    setup_timer_1(T1_DISABLED);
    setup_timer_2(T2_DISABLED,0,1);
    setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
     
     
       while ( getc(GPS) != 36 ) // le problème EST Là !!!!!!!!!!!!<<<<<<<
       {
       for (i=0;i<7;i++) //7
         {
         buffer[i]=getc(GPS);
         }
        }
     
    while (buffer[6]==',');
     
    for (i=1; i<=70; i++) //1.70 22.44
    {
         c = getc(GPS);
         buffer[i] = c;
    }
     
     
    printf(lcd_putc,"LAT:\n");
    for (i = 14; i <=24; i++) //16.26  1.20
    {
     
     
     
    printf(lcd_putc,"%c",buffer[i]);
     
    }
     
     
     
    for (i = 26; i <=36; i++)
    {
     
     
    }while(1);
    }
    Comment je dois faire pour recuper que les "$GPGGA"?

    merci
    Moi aussi ça m'intéresserait de savoir comment on peut juste traiter la ligne qui nous interesse ( ici GGA) et en extraire les informations genre latitude, longitude et altitude. Le programme en lui même a l'air presque terminé mais je ne suis pas assez bon en prog pour le compléter, donc si quelqu'un pouvait aider?

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par strygolw
    bonjour, je voudrai savoir comment je pourrai faire pour appartir d'un pin vers un PIC recuperer une trame mnea genre:

    $GPGGA,005417.800,0000.0000,N,00000.0000,E,0,00,50.0,0.0,M,,,,0000*34E,,,270102,,*16
    $GPGSA,A,1,,,,,,,,,,,,,50.0,50.0,50.0*050000,E,0,00,50.0,0.0,M,,,,0000*31
    $GPRMC,005417.800,V,0000.0000,N,00000.

    je voudrai recuperer et traiter que celle qui commence par "$GPGGA".
    le traitement consisterai a "saucissonner" la phrase a chaque ",".
    j'arrive a acquerir des caractères mais pas des phrases complète et bien structurées
    • Pour les récupérer, je ne sais pas, ça dépend du matériel.
    • Pour les repérer et si la chaine récupérée est bien formée, strncmp() peut aider si la positon est connue, sinon, strstr()...
    • Pour les ''saucissonner', probablement avec strtok() (standard C) ou strtok_r() (POSIX.1).

Discussions similaires

  1. Envois et reception d'une trame via Port Serie (com)
    Par samirraoui dans le forum VB.NET
    Réponses: 3
    Dernier message: 11/05/2015, 13h15
  2. envoi d'une trame via rs232 avec SOH CR LF
    Par tibjedi dans le forum C
    Réponses: 4
    Dernier message: 24/04/2013, 14h06
  3. envoi et reception d'une trame sous rs232
    Par azert2010 dans le forum C++
    Réponses: 7
    Dernier message: 25/03/2011, 07h26
  4. Réponses: 35
    Dernier message: 17/04/2009, 21h32
  5. Affichage incomplet après réception d'une trame via RS232
    Par sroge dans le forum Composants VCL
    Réponses: 3
    Dernier message: 01/02/2008, 15h50

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