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 :

décodage d'une trame


Sujet :

C++

  1. #1
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2015
    Messages : 23
    Par défaut décodage d'une trame
    bonjour , au cours d'un projet j’utilise une Socket c++ pour commander une machine , donc envoi une commande et recevoir une réponse en suite je fait un code pour le décodage de chaque trame reçus , je trouve une problème au niveau d'une trame dans laquelle je demande la configuration enregistrer dans l'appareil , le problème que cette config contient des différent type de variable , on trouve le string , int , long ... d'ou j'arrive pas de décoder cette trame et je demande vos aident.
    merci d'avance.

  2. #2
    Membre Expert
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Par défaut
    Bonjour et bienvenu.

    As-tu une définition détaillée de la structure de trame que la machine en question te renvoie ? Si oui, transmets la nous, sinon donne nous quelques exemple de ce qui t'es retourné. À partir de là on pourra peut être te venir en aide.

  3. #3
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2015
    Messages : 23
    Par défaut
    dans cette machine j'ai 991 paramètres de configuration et je doit les récupérer et les stocké dans un fichier pour l'utiliser ensuite si elle tombe en mode "offline" , en tous cas ces paramètres de configuration sont différent , on peut trouve des volume donc il suffit de les converti de hex en long (exp si le volume est 98765 (= 181CD(hex)) elle me répond "CD810100" , si un nom par exemple User Name : elle me répond "OPÉRATEUR" ect donc comme vous voyez j'ai besoins d'une fonction fait cette conversion une fois pour toute avec un boucle for (int i=1;i<992;i++)
    RQ: j'utilise le Protocol modbus RTU dans l'envois et la réception des trame.
    concernant le longueur du paramètre je peut le détecter dans le trame , il est variable

    voila c'est la fonction que je l'utilise pour demander les 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
     
    //request config
    void dan6000::Request_Config(std::string fichier)
    {
    	fstream file(fichier, ios::out); 
     
    	if (file)
    	{
    		uint8_t* sMsg;
    		uint8_t* rMsg;
    		string B;
    		for (int i = 1; i < 992; ++i)
    		{
    			sMsg = Request_Program_Code_Values_and_Attributes(i);
    			client.Send((char*)sMsg,10);
    			rMsg = client.Recv();
                            int PCvLength = resp[4];
    			uint8_t* tab = new uint8_t[PCvLength+4];
    			for (int i = 0; i < 15; i++)
    				tab[i] = rMsg[i];
    			B = Decd_Request_Program_Code_Values(tab);
    			file << i << " " << B << endl;
    		}
     
    		file.close();
    	}
     
    	else
    		cerr << "Impossible d'ouvrir le fichier !" << endl;
    }

    c'est un exemple de fichier log que je trouve
    send : 03|42|06|22|80|03|80|03|62|7A| // 03 adresse machine , 42 channel , 06 longueur du trame , 22 code pour demande les paramètres de config , 8003 représentation en hex du programme code num 896 , 627A crc
    receive : 03|42|05|22|01|00|04|B1|59| //03 , 42 , 05 longueur ,22,01 longueur du paramètre , 00 le paramètre , 04 ne m’intéresse plus
    donc dans cette exemple : le paramètre 896 a la valeur 0 comme valeur .
    j’espère que c'est plus claire

  4. #4
    Membre Expert
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Par défaut
    Pas vraiment . Quel est ton problème ?

  5. #5
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Ton programme ne peut pas deviner tout seul le format d'un champ.
    Il n'y a que deux solutions: soit il sait à l'avance le type de chaque champ, soit il a déjà lu une information qui permet de le deviner.

    Si un champ sur deux est un int (enum) qui donne le type du champ suivant, c'est très facile.
    Par exemple, c'est exactement comme cela que fonctionne le bytecode (forme compilée du java)

  6. #6
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2015
    Messages : 23
    Par défaut
    concernant les deux solutions , la premières a rejeter parce qu’il ne connais rien a l'avance,
    il peut seulement lire le longueur du cette paramètre pas plus.

  7. #7
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2015
    Messages : 23
    Par défaut
    si je comprend bien il faut deux fonctions l'une pour la conversion du hex en décimal (si le longueur ne dépasse pas 4 ( int , long)) et une autre pour récupérer une chaîne de caractère si longueur dépasse 4 , ou bien j'ai une autre idée ; on doit résonnais sur le code ascii c'est mieux ? nn ?

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 146
    Billets dans le blog
    4
    Par défaut
    Je comprends pas bien le problème..
    Tu sais pas faire de lecture/découpage de chaine ?
    Ou tu sais pas utiliser ntohs/htons ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  9. #9
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2015
    Messages : 23
    Par défaut
    concernant ntohs je ne les connus plus .
    mon problème autrement dit : comment je peut décoder mon trame avec une seule fonction en se basant sur le message de réception ? (ce message après le décodage il peut être un entier ou bien chaîne de caractère ou bien variable de type long... )

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 146
    Billets dans le blog
    4
    Par défaut
    bah à part lire la doc qui en parle je vois pas bien quelle aide tu espères de nous..
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  11. #11
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Comment le faire en une seule fonction? en écrivant la dite fonction.
    Il suffit de lire chaque morceau de la chaine, l'un après l'autre.

    quitte à donner à cette fonction les informations nécessaires pour savoir comment lire une trame en particulier

Discussions similaires

  1. Algorithme de décodage d'une trame
    Par Kesle dans le forum Débuter
    Réponses: 12
    Dernier message: 18/06/2009, 10h06
  2. Obtenir une trame Ethernet
    Par Scorff dans le forum Développement
    Réponses: 15
    Dernier message: 11/09/2006, 12h22
  3. [Réseau] Envoyer une trame tcp
    Par heid dans le forum Web & réseau
    Réponses: 5
    Dernier message: 18/07/2005, 13h07
  4. Comment reconnaître une trame Profibus ?
    Par hasna45 dans le forum Développement
    Réponses: 4
    Dernier message: 25/10/2004, 19h53
  5. Réponses: 2
    Dernier message: 04/02/2004, 22h32

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