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

Visual C++ Discussion :

Données envoyées sous forme ASCII


Sujet :

Visual C++

  1. #1
    Membre du Club
    Homme Profil pro
    Electronicien
    Inscrit en
    Août 2008
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Electronicien
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2008
    Messages : 360
    Points : 53
    Points
    53
    Par défaut Données envoyées sous forme ASCII
    Bonjour,

    J'ai une interface PC compilé sous Visual C++ avec laquel j'envoi des données dans mon micro(PIC32MX795) via l'USB, seulement je rencontre le même problème que j'ai eu dans l'autre sens, s'est à dire que mon micro réceptionne bien ces données mais sous forme ASCII(hex).

    ce que je souhaite faire, tout comme j'ai fais dans l'autre sens, c'est envoyer à mon micro ma donnée converti en décimale(hex) dans laquel j'aurai au préalable ajouté sur l'octet de poids faible un ID de manière à le recevoir et l'identifier avec mon micro ou bien,

    je laisse ma donnée sous forme ascii(hex) dans laquel je rajoute mon ID en poids faible et par la suite je fais la convertion avec mon micro ?

    Pour le moment, mes connaissances sur l'environnement Visual C++, m’empêche d'avancer aussi rapidement que je le voudrais, et je ne sais pas si il existe des instructions particulière ou si je dois faire la fonction pour ce faire.

    Pour le moment, un clic sur mon bouton me permet d'envoyer ma donnée comme tel

    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
     
    		private: System::Void btnSendData_Click(System::Object^  sender, System::EventArgs^  e)
    		{
     
    			try
    			{
     
    				//array<System::Byte>^ bufout = gcnew array<System::Byte>(6);
    				System::String^ valst(envoi0->Text);
     
     
    				serialPort1->Write(valst);
     
    			}
    			catch(...)
    			{
    			}
    		}
    si j'envoi 12 je reçois 00003231

    Merci de votre aide

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    "Sous forme ASCII (Hex)" c'est autocontradictoire et il manque une partie de l'information.

    Ce que tu envoies en fait (0x31 0x32), c'est la valeur 12 sous forme de chaîne (formatée en décimal), encodée en ASCII.

    J'ignore si ce que je vais proposer est la solution la plus performante, mais c'est la plus propre algorithmiquement: Refaire la même chose en sens inverse.
    Code C++/CLI : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private: array<System::Byte>^ FormatAndEncode(int val);
    private: int DecodeAndParse(array<System::Byte>^ bytes);
    Code C++/CLI : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include "MaClasse.h"
    using namespace System;
    using namespace System::Text;
     
    array<Byte>^ MaClasse::FormatAndEncode(int val)
    {
    	String^ str = val.ToString(L"D");
    	return Encoding::ASCII->GetBytes(str);
    }
     
    int MaClasse::DecodeAndParse(array<Byte>^ bytes);
    {
    	String^ str = Encoding::ASCII->GetString(bytes);
    	return Convert::ToInt32(str, 10);
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre du Club
    Homme Profil pro
    Electronicien
    Inscrit en
    Août 2008
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Electronicien
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2008
    Messages : 360
    Points : 53
    Points
    53
    Par défaut
    Oui autant pour moi c'est effectivement une chaine.

    Désolé, mais à priori le #include "MaClasse.h" ne passe pas, est-ce un fichier en .h que je devrais avoir dans mon répertoire ou je dois créer ce fichier avec quoi dedans.

    désolé pour les questions de débutant, mais j'essai de me documenté mais les explications que je récolte pour l'instant son soit trop compliqué à comprendre soit pas assez explicite.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    C'est surtout d'abstraction que tu manques.
    J'ai mis "maclasse.h" parce que j'ignore le nom de la classe que tu compiles (même si ça a une chance d'être "Form1").

    Normalement, tu as déjà un Form1.h et Form1.cpp, tu dois donc ajouter ce code dans les fichiers appropriés en remplaçant MaClasse par Form1...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre du Club
    Homme Profil pro
    Electronicien
    Inscrit en
    Août 2008
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Electronicien
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2008
    Messages : 360
    Points : 53
    Points
    53
    Par défaut
    Ha ok Désolé

    Par contre, la valeur que j'envoi est un string, puisque je la récupère d'une textbox(a mois que d'autres composants me permettent de récupérer la valeur directement en entier) et les fonctions que tu me propose traites un entier.

    à moins que quelque choses m'échappe, ce qui est une possibilité.

    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
    		private: System::Void btnSendData_Click(System::Object^  sender, System::EventArgs^  e)
    		{
     
     
    			try
    			{
     
     
    				System::String^ val(envoi0->Text);
     
    				serialPort1->Write(val);
     
    			}
    			catch(...)
    			{
    			}
    		}

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Le SerialPort peut peut-être envoyer directement une string (je n'ai pas regardé) mais si tu ne contrôle pas sous quelle forme elle est encodée, tu risques d'avoir de mauvaises surprises.

    C'est pourquoi on utilise un encodage explicite (souvent Encoding::ASCII, Encoding::UTF8 ou Encoding::Default) pour contrôler ça.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre du Club
    Homme Profil pro
    Electronicien
    Inscrit en
    Août 2008
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Electronicien
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2008
    Messages : 360
    Points : 53
    Points
    53
    Par défaut
    Oui SerialPort envoi directement le string, seulement a l'arrivé celui-ci est sous forme de caractères ascii, comme tel pour 12 le buffer du micro réceptionne USB_Out_Buffer={0x32,0x31} comme tu avais descrit.

    Seulement avant d'envoyer mes valeurs issu d'une textbox il faut que je leur ajoute un ID comme j'ai fait dans l'autre sens et éventuellement que je les envoi en décimal.

    Je dis éventuellement par ce que je pourrais très bien faire la conversion ascii en int dans le micro mais autant le traiter directement à la base.

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120

  9. #9
    Membre du Club
    Homme Profil pro
    Electronicien
    Inscrit en
    Août 2008
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Electronicien
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2008
    Messages : 360
    Points : 53
    Points
    53
    Par défaut
    Excuse moi, mais là j'ai du mal a comprendre, ce que tu m'as envoyé.

    Par exemple dans mon micro pour l'allé je fais ça.
    Je rentre mon ID, la valeur a envoyer, le tableau que j'envoi (usb_buff_in[]), puis le nombre d'octet(ce qui pourra être optimiser par la suite)

    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
     
    void inttoarray(char ID,int val,char tab[],char nbr_octet)
    {
    char i;
     
    tab[0]=ID;
    tab[1]=nbr_octet;
     
     	for(i=2;i<nbr_octet+2;i++)
    	{
    	tab[i]=val;
    	val=val>>8;
    	}
     
     
    }
    Alors effectivement la valeur que j'envoi est d'office en hexa exemple pour 456 envoi 1C8 dans lequel je vais mettre l'ID exemple =0x01 et le nombre d'octet =0x04 ce qui donne USB_BUFF_in[0x01;0x04;0xC8;0x01;0x00;0x00].

    Pour le retour sous visual C++ j'aimerai faire la même chose, ma difficulté est de convertir le string de la textbox.

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Il faut prendre un peu de recule.

    Vous vous débâtez avec la sérialisation d'un nombre sous forme de string à faire passer dans le port série.

    Mais si vous avez directement un nombre à sérialiser pour le faire passer dans le port série, ça serait bien plus simple.

    Comment ?

    C'est un nombre, donc pourquoi en faire une string ?

    Car vous utilisez une TextBox ?

    Bin, n'utilisez pas une TextBox qui peut prendre tout en entré, mais surtout n'importe quoi.

    Utiliser à la place un control NumericUpDown qui ne peut prendre qu'un nombre en entré (donc plus de vérification de conformité de surface à faire) et donne directement un nombre en sortie, que vous donnez directement en entré du port série.

    Reste peut-être le problème de grand et des petitboutiens.

  11. #11
    Membre du Club
    Homme Profil pro
    Electronicien
    Inscrit en
    Août 2008
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Electronicien
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2008
    Messages : 360
    Points : 53
    Points
    53
    Par défaut
    Effectivement c'est une bonne idée, Merci Bacelar, je vois ça

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Cette idée de bacelar ne marche que si tu es libre de modifier le protocole à ta guise.

    Si le protocole est hors de ton contrôle, cela veut dire que tu dois échanger des entiers formatés en décimal sur une chaîne encodée en ASCII, pour être compatible avec ce qu'il y a à l'autre bout.

    Ce que tu fais avec cet entier une fois celui-ci récupéré (TextBox, NumericUpDown, etc.) est libre, par contre.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Membre du Club
    Homme Profil pro
    Electronicien
    Inscrit en
    Août 2008
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Electronicien
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2008
    Messages : 360
    Points : 53
    Points
    53
    Par défaut
    En faite, j'ai réussi à faire ce que je souhaitai

    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
    		private: System::Void btnSendData_Click(System::Object^  sender, System::EventArgs^  e)
    		{
     
     
     
    			try
    			{
     
    				array<System::Byte>^ buffout = gcnew array<System::Byte>(6);
     
     
     
    				int val;	
     
    				val=(int)valeur1->Value;
     
    				System::String^ valhex= val.ToString("X8")
     
    				inttoarray(ID_VAL1, val, buffout,4);
     
    				serialPort1->Write(buffout, 0, 6);
     
     
     
     
    			}
    			catch(...)
    			{
    			}
    		}
    avec la fonction que j'ai fais de l'autre côté, j'ai repris la même chose côté PC

    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
     
    		void inttoarray(char ID, int val, array<System::Byte>^ arr, char nbr_octet)
    		{
    			char i;
     
    			arr[0] = ID;
    			arr[1] = nbr_octet;
     
    			for (i = 2; i<nbr_octet + 2; i++)
    			{
    				arr[i] = val;
    				val = val >> 8;
    			}
     
     
    		}

    Exemple : j'envoi 134 via une NumericUpDown de l'interface, je reçois bien ce que je souhaite 00860401, avec en byte de poids faible ID=01, nombre d'octet de la valeur=04 et la valeur 86HEX = 134 DEC.
    En plus je prend uniquement des nombres et pas de lettres que je voulais exclure, maintenant il y a certainement des choses à optimiser

    Merci

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

Discussions similaires

  1. [PDO] Représentation des données sqlite sous forme de tableau HTML
    Par boulamite dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 03/06/2008, 18h45
  2. Afficher ma donnée Base64Binary sous forme d'image
    Par tarekos dans le forum XML/XSL et SOAP
    Réponses: 6
    Dernier message: 03/06/2008, 17h08
  3. récupérer des données XML sous forme de tableau
    Par ar vuzhugenn dans le forum ActionScript 1 & ActionScript 2
    Réponses: 8
    Dernier message: 22/04/2008, 21h21
  4. [MySQL] probleme afficher donnée BDD sous forme de tableau
    Par body72 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 17/03/2008, 21h27
  5. Récuperation des données envoyées par Form en POST
    Par bobatel dans le forum Langage
    Réponses: 9
    Dernier message: 26/04/2006, 14h59

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