Précédent   Forum des professionnels en informatique > C et C++ > C++
C++ Forum d'entraide technique sur le langage C++. Avant de poster -> F.A.Q C++
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/01/2012, 15h17   #1
Invité de passage
 
Homme
Étudiant
Inscription : janvier 2012
Messages : 30
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2012
Messages : 30
Points : 3
Points : 3
Par défaut Taille d'une trame

J'ai réalisé un petit programme qui traite des trames reçu sur un port serie pour en extraire les données importantes !

J'arrive à traiter toutes les trames une par une mais j'ai un problème sur la longueur des trames quand je veut les traiter en une fois.

Exemple des trames que je traite

Code :
1
2
3
$GPRMC,123943.000,A,5022.6010,N,00304.2600,E,0.00,334.30,160112,,,A*68
$IIMWV,191.0,R,003.60,N,A
$IIVHW,,,,,1.3,N,,*2b
Donc on voit que les trames ne font pas toutes la même taille (par exemple la première 64, la troisième 21,...) si la trame est trop longue ou trop courte par rapport à la taille que j'indique dans mon code le programme plante !

Ma méthode pour récupérer ma trame :
Code :
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
bool WM918::RecupData()
{
        bool RecupOk=false;
        const int TAILLETRAME=21;
        DWORD NbCar=0;
        int Compteur=0;
        AnsiString Trame;
        TrameBrute="";
 
        LExtract->OuvrirPort(Erreur);
        do
        {
                Trame ="";
                bool BufReaded = LExtract->ReadBuffer(Trame,Erreur);
                NbCar = Trame.Length();
 
                if(NbCar>0)
                {
                        RecupOk=true;
                        Compteur=Compteur+NbCar;
                        TrameBrute=TrameBrute+Trame;
                }
        }
        while(Compteur<TAILLETRAME);
 
        LExtract->FermerPort(Erreur);
 
        cout<<"Trame analyse : \n"<<TrameBrute.c_str()<<endl;
        return RecupOk;
}
Je ne trouve pas de solution à comment faire pour avoir la bonne taille de chaque, car si je n'indique pas de taille il n'y a pas de fin et si je met la mauvaise ça plante !

Merci d'avance pour votre aide
Mini-Tyson est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 10h30   #2
Membre éclairé
 
Inscription : décembre 2008
Messages : 236
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 236
Points : 315
Points : 315
Si LExtract->ReadBuffer(Trame,Erreur) revoit un false en fin de trame, alors c'est plutôt cette valeur de retour qu'il faut caser dans le test de ton while.
Ou, s'il est convenu que tes trames se terminent par des caractères spéciaux, compare Trame à ce caractère dans ton test.

Quoiqu'il arrive, prédéterminer "en dur" une taille de trame est probablement une mauvaise idée (ou alors une taille max, à la limite).
cob59 est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/01/2012, 12h00   #3
Membre du Club
 
Avatar de Jerome S
 
Homme Jérôme
Développeur informatique
Inscription : août 2011
Messages : 59
Détails du profil
Informations personnelles :
Nom : Homme Jérôme
Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

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

Informations forums :
Inscription : août 2011
Messages : 59
Points : 69
Points : 69
Je me trompe peut-être mais j'ai l'impression que chaque trame commence par le caractère "$". Pourquoi ne pas lire ta trame jusqu'a ce que tu rencontre ce caractère ? Si c'est le cas, bien sur, tu ne l'ajoute pas et tu le compte pour la suivante.
Le soucis, si ca en est un, c'est que pour achever une trame, ton application attendrai la suivante
Jerome S est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/01/2012, 22h55   #4
Invité de passage
 
Homme
Étudiant
Inscription : janvier 2012
Messages : 30
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2012
Messages : 30
Points : 3
Points : 3
Déjà merci pour vos réponses.

cob59 j'avais pas pensé et je vais test mais le problème qu'il va y avoir c'est qu'il n'y a pas d'arrêt au niveau des trames reçus vu que se sera toujours true !

Jerome S je pensais faire comme ça mais je ne sais pas comment le réaliser
Mini-Tyson est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 07h29   #5
Rédacteur/Modérateur
 
Avatar de 3DArchi
 
Inscription : juin 2008
Messages : 7 494
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 7 494
Points : 9 791
Points : 9 791
Salut,
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
                Trame ="";
while(LExtract->ReadBuffer(Trame,Erreur))
        {
                NbCar = Trame.Length(); 
                if(NbCar>0)
                {
                        RecupOk=true;
                        Compteur=Compteur+NbCar;
                        TrameBrute=TrameBrute+Trame;
                }
                if(Compteur>=TAILLETRAME)
                {
                     return RecupOk;
                }
        }
        return RecupKo;
Ensuite une enveloppe RAII pour LExtract.
__________________
Ressources proposées par 3DArchi.
Les fonctions virtuelles en C++.
3DArchi est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 31/01/2012, 11h09   #6
Invité de passage
 
Homme
Étudiant
Inscription : janvier 2012
Messages : 30
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2012
Messages : 30
Points : 3
Points : 3
je savais même pas qu'on pouvait mettre un while sans do

merci

J'ai lu la faq sur RAII mais comme j'ai pas super bien compris et que je ne serais pas l'expliquer, je préfère m'en passer.


Code :
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
bool WM918::RecupData()
{
        bool RecupOk=false;
        const int TAILLETRAME=14;
        DWORD NbCar=0;
        int Compteur=0;
        AnsiString Trame="";
        TrameBrute="";
 
        LExtract->OuvrirPort(Erreur);
 
        cout<<"Envoyez votre trame sur le port serie 1 et validez par entree";
        getch();
 
        while(LExtract->ReadBuffer(Trame,Erreur))
        {
                NbCar = Trame.Length();
 
                if(NbCar>0)
                {
                        RecupOk=true;
                        Compteur=Compteur+NbCar;
                        TrameBrute=TrameBrute+Trame;
                }
 
                if(Compteur>=TAILLETRAME)
                {
                        LExtract->FermerPort(Erreur);
                        cout<<"Trame analyse : \n"<<TrameBrute.c_str()<<endl;
                        return RecupOk;
                }
        }
}

J'ai donc fait quelques retouches mineurs pour que mon code tourne sans provoqué de fuite mémoire ou d'erreur
- j'ai rajouté un petit affichage de texte (pour expliquer ce que le programme attend) et j'ai rajouté un getch pour qu'il reçoit la trame car si la trame est reçu pendant while, returnok passe à true mais sans avoir récupérer la trame !
- J'ai aussi rajouter mon fermerport dans le if car sinon il ne se ferme pas et un petit affichage pour voir ma trame !


je sais pas si ce que j'ai fait est correct mais pour moi ça me semble pas mal !


PS: si c'est bon ma prochaine étape sera "de me passer du getch" pour pouvoir analyser des trames à la suite sans quitter le programme et non une seule trame traitée puis relancer le programme mais bon faut déjà que ma première étape soit bonne pour faire cela !
Mini-Tyson est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 14h41   #7
Membre du Club
 
Avatar de Jerome S
 
Homme Jérôme
Développeur informatique
Inscription : août 2011
Messages : 59
Détails du profil
Informations personnelles :
Nom : Homme Jérôme
Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

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

Informations forums :
Inscription : août 2011
Messages : 59
Points : 69
Points : 69
Dans le cas
Code :
1
2
3
do{
    //Quelque chose
}while(condition)
le contenu de la boucle s'effectue dans tous les cas, meme si la condition est fausse.
Par contre, dans
Code :
1
2
3
4
while(condition)
{
    //Quelque chose
}
le contenu de la boucle n'est parcouru que si la condition est vraie.
En gros, les deux sont identiques à l'exception de la première entrée dans la boucle (dans tous les cas pour l'un, selon la condition pour l'autre).
__________________
Dans le monde, il y a 10 types de personnes. Ceux qui comprennent ce message et les autres
Jerome S est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 01/02/2012, 07h22   #8
Rédacteur/Modérateur
 
Avatar de 3DArchi
 
Inscription : juin 2008
Messages : 7 494
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 7 494
Points : 9 791
Points : 9 791
Citation:
Envoyé par Mini-Tyson Voir le message
J'ai lu la faq sur RAII mais [...] je préfère m'en passer.
C'est un concept fondamental dans le développement C++. Si tu ne l'appliques pas, alors arrêtes le C++.
__________________
Ressources proposées par 3DArchi.
Les fonctions virtuelles en C++.
3DArchi est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/02/2012, 14h49   #9
Invité de passage
 
Homme
Étudiant
Inscription : janvier 2012
Messages : 30
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2012
Messages : 30
Points : 3
Points : 3
Je viens de lire la définition sur wiki et en faites je l'utilise déjà sans savoir le nom exact donc RAII, simplement avec la faq c++ je pensais à quelques choses de plus développer !

Je voudrais maintenant pouvoir traiter plusieurs trames à la suite sans redémarrer le programme mais si je mets une grosse boucle do-while mais au final c'est une par une au lieu de traiter à la suite
Mini-Tyson est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 11h30   #10
Invité de passage
 
Homme
Étudiant
Inscription : janvier 2012
Messages : 30
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2012
Messages : 30
Points : 3
Points : 3
Personne pour m'aider pour traiter les trames non stop sans relancer le programme

Code :
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
int main(int argc, char* argv[])
{
        bool TrameRecue=false;
        WM918 Station("com1:", "4800,n,8,1");
        string Mesure="";
 
        //Réception d'une trame
        TrameRecue=Station.RecupData();
        if(TrameRecue==true)
                Station.DecapsuleTrame();
 
        //Affichage des resultats
 
        cout<< "\n---------------\n Temperature de l'eau et du vent\n";
        Mesure =Station.LitMesure("TemV").c_str();
        cout<< "\nTemperature du vent : "<<Mesure<<" "<<char(248)<<"C"<<endl;
 
        Mesure=Station.LitMesure("TempE").c_str();
        cout<< "Temperature de l'eau : "<<Mesure<<" "<<char(248)<<"C"<<endl<<endl;
 
        cout<< "---------------\n Direction et vitesse du vent\n\n";
        Mesure =Station.LitMesure("Dir").c_str();
        cout<< "Direction du Vent : "<<Mesure<<" "<<char(248)<<endl;
 
        Mesure=Station.LitMesure("Vit").c_str();
        cout<< "Vitesse du Vent : "<<Mesure<< " N/h"<<endl<<endl;
 
        cout<< "---------------\n Vitesse du Bateau\n\n";
        Mesure=Station.LitMesure("VitB").c_str();
        cout<< "Vitesse du Bateau : "<<Mesure<< " N"<<endl<<endl;
 
        cout<< "---------------\n Heure, Latitude, Longitude et Date - GPS\n\n";
        Mesure =Station.LitMesure("Dat").c_str();
        cout<< "Date : "<<Mesure<< " -> JJMMAA"<<endl;
 
        Mesure=Station.LitMesure("Heur").c_str();
        cout<< "Heure : "<<Mesure<< " -> HHMMSS"<<endl;
 
        Mesure= Station.LitMesure("Lati").c_str();
        cout<< "Latitude : "<<Mesure<<endl;
 
        Mesure= Station.LitMesure("Long").c_str();
        cout<< "Longitude : "<<Mesure<<endl;
 
        getch();
        return 0;
}
voilà mon code pour l'affichage, j'ai tenté avec des if-else et des do-while mais je n'arrive pas au résultat que je souhaite car là on a plus l'impression que le programme ce stop et reprend au début au lieu de vraiment continuer de traiter des trames qui arrivent sur le port serie !
Mini-Tyson est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h51.


 
 
 
 
Partenaires

Hébergement Web