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 :

Taille d'une trame


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    52
    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 : 52
    Points : 29
    Points
    29
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
    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

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    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).

  3. #3
    Membre régulier Avatar de Jerome S
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Août 2011
    Messages : 62
    Points : 89
    Points
    89
    Par défaut
    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
    Dans le monde, il y a 10 types de personnes. Ceux qui comprennent ce message et les autres

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    52
    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 : 52
    Points : 29
    Points
    29
    Par défaut
    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

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    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
                    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.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    52
    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 : 52
    Points : 29
    Points
    29
    Par défaut
    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 : 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
    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 !

  7. #7
    Membre régulier Avatar de Jerome S
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Août 2011
    Messages : 62
    Points : 89
    Points
    89
    Par défaut
    Dans le cas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    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++.

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    52
    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 : 52
    Points : 29
    Points
    29
    Par défaut
    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

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    52
    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 : 52
    Points : 29
    Points
    29
    Par défaut
    Personne pour m'aider pour traiter les trames non stop sans relancer le programme

    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
    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 !

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

Discussions similaires

  1. Comment calculer la taille d'une base de données ?
    Par say dans le forum Décisions SGBD
    Réponses: 8
    Dernier message: 01/04/2011, 16h48
  2. Taille d'une trame UDP.
    Par LinuxUser dans le forum Réseau
    Réponses: 15
    Dernier message: 30/11/2008, 15h21
  3. [SQL SERVEUR]taille d'une base de donnée
    Par hirochirak dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 08/01/2004, 12h07
  4. : Adapter la taille d'une grille
    Par SteelBox dans le forum C++Builder
    Réponses: 3
    Dernier message: 31/07/2003, 07h08
  5. Taille d'une console sous linux
    Par Shinjuku dans le forum C
    Réponses: 7
    Dernier message: 13/06/2003, 12h44

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