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 :

Lire des Trames Nmea GPS sur port Série avec C++ builder


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2005
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Lire des Trames Nmea GPS sur port Série avec C++ builder
    Allo à tous ,
    J'ai presque fini mon projet de logiciel pour Lire les Trames Nmea de GPS.

    Je suis bloqué pour analyser chaque Trames car un GPS envoie en continue des Trames.

    $GPGGA,052232.325,3554.9581,N,03544.5423,E,0,0,0,,M,,M,,*47
    $GPGNS,052232.325,3554.9581,N,03544.5423,E,A,0,0,,M,,*60
    $GPRMC,052232.325,A,3554.9581,N,03544.5423,E,48596,11,248,1,050121,,,A*54
    $GPGLL,3554.9581,N,03544.5423,E,052232.325,A,A*5D

    Dans mon logiciel je vois toutes les trames passé dans mon RichEdit ou Fenêtre Data sans problèmes.

    Je n'ai pas de GPS sous la main mais avec Hyperterminal ou autre logiciel j'envoie mes trames comme si j'avais un GPS.

    Bon au début je voulais juste filtré $GPGGA ou $GPGLL pour extraire la Latitude et Longitude.

    Si je transmet à mon logiciel juste 1 trame de $GPGGA ou $GPGLL ca fonctionne bien et ca décode bien.

    Le probème est si j'envoie plus Trames et je peux juste extraire la Première Trame ;-(

    Je me doute que je dois faire une autre boucle pour passer à la trame suivante etc.... et voilà je sais pas comment me sortir de la

    Oui j'ai lu beaucoup d'exemple mais pas sur le Builder C++ 17 communauté que je viens de mettre à jours.

    Je travaille avec TMS Async pour piloter le port série.

    J'ai chercher dans le Forums et sur la FAQ et ma recherche est pas fructueuse.

    Si vous avez un lien de Sources ou d'explication je suis ouvert.

    Voici mon code :

    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
    //---------------------------------------------------------------------------
    //              Port GPS RX
    //---------------------------------------------------------------------------
    void __fastcall TMain_Dlg::VaComm2RxChar(TObject *Sender, int Count)
    {
    		AnsiString Gps_Data;
    		int i;
    		Gps = VaComm2->ReadText();                                              // Lire le Port Serie en ASCII
     
    		// GPS_RX->Lines->Add( IntToStr(Count) + " bytes");     	 / /Voir le Nombre de Bytes Recu
    		// GPS_RX->Lines->Add(Gps.Length() + " bytes");                  //Voir le Nombre de Bytes Recu
    		char GPS_Count[Gps.Length()];
     
    	//==================================================================================  
     
    	 //	 while (Gps[i] >= 13) ;
     
    		for( i = 1; i < Gps.Length(); i++)                     			// Faire une boucle selon la longeur de Gps.Length()
    		{
    		if(Gps[i]!= 13)                                                        	        // != '*' Detecter EOF ou Line feed ou caractere de mon choix
    													// tant qu'on a pas rencontré le caractère 13 retour a la ligne '*'
    			Gps_Data = Gps_Data + Gps[i];                                 // Refaire la Trame de Gps_Data
    		else 											// sinon, donc on a rencontré le caractère 13 retour a la ligne
    			i = Gps.Length(); 							// on met i = Gps.Length() comme ça la boucle For va s'arrêter tout de suite.
    		 }
     
     
     
     
    		 GPS_RX->Lines->Add(Gps_Data);                                      // Affiche la Trame recue dans le RichEdit GPS_RX
     
    		  Gps_Rx = MidStr(Gps_Data,0,6);                                       //Filtré dans la trame Gps_Rx les 6 premiers caratères
    		   if ( GLL_Select -> Checked)
    		 {
    				if (Gps_Rx == "$GPGLL")                                        // Valeur à filtré   $GPGLL
    				{
    				Debut_Latitude->Text = MidStr(Gps_Data,8,11);
    				Debut_Longitude->Text = MidStr(Gps_Data,20,12);
     
    				Fin_Latitude->Text = MidStr(Gps_Data,8,11);
    				Fin_Longitude->Text = MidStr(Gps_Data,20,12);
     
    				YoYo_Latitude->Text = MidStr(Gps_Data,8,11);
    				YoYo_Longitude->Text = MidStr(Gps_Data,20,12);
    				 }
    		 }
    			if ( GGA_Select -> Checked)
    		  {
    				if (Gps_Rx == "$GPGGA")                                         // Valeur à filtré $GPGGA
    				{
    				Debut_Latitude->Text = MidStr(Gps_Data,19,11);
    				Debut_Longitude->Text = MidStr(Gps_Data,31,12);
     
    				Fin_Latitude->Text = MidStr(Gps_Data,19,11);
    				Fin_Longitude->Text = MidStr(Gps_Data,31,12);
     
    				YoYo_Latitude->Text = MidStr(Gps_Data,19,11);
    				YoYo_Longitude->Text = MidStr(Gps_Data,31,12);
     
    				}
    		  }
     
     
     
    		 //AnsiString Receive =  VaComm2->ReadText();
    		//Memo1->Lines->Text = Memo1->Lines->Text + VaComm2->ReadText();
     
    		//Memo1->Lines->Add("Reading " + IntToStr(Count) + " bytes");
     }

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2005
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Ca fait juste lire la première Trame et ca filtre bien juste la première Trame ;-(
    Ca fait juste lire la première Trame et ca filtre bien juste la première Trame ;-(

    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
     
     
    //---------------------------------------------------------------------------
    //              Port GPS RX
    //---------------------------------------------------------------------------
    void __fastcall TMain_Dlg::VaComm2RxChar(TObject *Sender, int Count)
    {
    		AnsiString Gps_Data;
    		int i;
    		Gps = VaComm2->ReadText();                                              // Lire le Port Serie en ASCII
     
    		// GPS_RX->Lines->Add( IntToStr(Count) + " bytes");     	    //Voir le Nombre de Bytes Recu
    		// GPS_RX->Lines->Add(Gps.Length() + " bytes");                   //Voir le Nombre de Bytes Recu
    		char GPS_Count[Gps.Length()];
     
     
    ====================================   Problème de boucle afin de lire la prochaine Trame ===================
     
    while (Gps != 13)
    	 {
    		for( i = 1; i < Gps.Length(); i++)                     		// Faire une boucle selon la longeur de Gps.Length()
    		{
    		if(Gps[i]!= 13)                                                        	// != '*' Detecter EOF ou Line feed ou caractere de mon choix
    											       // tant qu'on a pas rencontré le caractère 13 retour a la ligne '*'
    			Gps_Data = Gps_Data + Gps[i];                        // Refaire la Trame de Gps_Data
    		else 									      // sinon, donc on a rencontré le caractère 13 retour a la ligne
    			i = Gps.Length(); 					    // on met i = Gps.Length() comme ça la boucle For va s'arrêter tout de suite.
     
    		}
    			  Gps_Nmea(Gps_Data);                              // Je pense trouvé une piste pour sortir de ma boucle en creant une routine pour filtrer mes Trames
    	 }
    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
     
     
     //-----------------------------------------------------------------------------
     //                 Filtre pour NMEA  $GPGLL ou $GPGGA
     //-----------------------------------------------------------------------------
     void __fastcall TMain_Dlg::Gps_Nmea(AnsiString Gps_Data)
     {
    		 GPS_RX->Lines->Add(Gps_Data);                                          // Affiche la Trame recue dans le RichEdit GPS_RX
     
    		  Gps_Rx = MidStr(Gps_Data,0,6);                                        //Filtré dans la trame Gps_Rx les 6 premiers caratères
    		   if ( GLL_Select -> Checked)
    		 {
    				if (Gps_Rx == "$GPGLL")                                         // Valeur à filtré   $GPGLL
    				{
    				Debut_Latitude->Text = MidStr(Gps_Data,8,11);
    				Debut_Longitude->Text = MidStr(Gps_Data,20,12);
     
    				Fin_Latitude->Text = MidStr(Gps_Data,8,11);
    				Fin_Longitude->Text = MidStr(Gps_Data,20,12);
     
    				YoYo_Latitude->Text = MidStr(Gps_Data,8,11);
    				YoYo_Longitude->Text = MidStr(Gps_Data,20,12);
    				 }
    		 }
    			if ( GGA_Select -> Checked)
    		  {
    				if (Gps_Rx == "$GPGGA")                                         // Valeur à filtré $GPGGA
    				{
    				Debut_Latitude->Text = MidStr(Gps_Data,19,11);
    				Debut_Longitude->Text = MidStr(Gps_Data,31,12);
     
    				Fin_Latitude->Text = MidStr(Gps_Data,19,11);
    				Fin_Longitude->Text = MidStr(Gps_Data,31,12);
     
    				YoYo_Latitude->Text = MidStr(Gps_Data,19,11);
    				YoYo_Longitude->Text = MidStr(Gps_Data,31,12);
     
    				}
    		  }
     
    }

  3. #3
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    Difficile de te répondre avec précision. Ce qui est important pour relire un code ce sont les types des variables et on ne les a pas.
    Néanmoins une ligne m'interroge. Ligne 21 pourquoi saute tu le premier caractère de la trame ? En partant du début, toutes les lignes devraient être décodées sauf peut-être la première!

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2005
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Si je met i=0 ca compile bien.
    Quand je recois des trames ca me donne une Erreur de Vérification d'étendue et le logiciel jamme pour chaque Trame.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for( i = 1; i < Gps.Length(); i++)                     		// Faire une boucle selon la longeur de Gps.Length()

    J'utilise pas beaucoup de variable car je manipule des caratères ASCII dans les trames de GPS.


    AnsiString Gps_Data;
    AnsiString Gps;
    int i;
    La je viens de recevoir un GPS USB pour finaliser et ca fonctionne bien ;-).

    Mais je suis pas à l'aise avec mon code car je pense que je lit pas Ligne par Ligne.

    Comme quand on veut lire un fichier et en extraire ligne par ligne avec le Saut de ligne ou carriage return.

    Mais bon je vais refaire de la lecture sur comment extraire des lignes de texte et les mettre peut être dans un Tableau etc... ???

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Batch] Envoi d'une trame sur port série
    Par Superzest 76 dans le forum Scripts/Batch
    Réponses: 8
    Dernier message: 06/11/2018, 10h27
  2. Réponses: 2
    Dernier message: 23/11/2015, 23h32
  3. lire trame sur port série
    Par ritchyv dans le forum C
    Réponses: 20
    Dernier message: 26/11/2009, 17h02
  4. Réponses: 3
    Dernier message: 28/06/2006, 16h13
  5. [Débutant] Réception sur port série
    Par Tophe59 dans le forum Langage
    Réponses: 43
    Dernier message: 28/06/2004, 11h04

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