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 :

convertir decimal en hexa


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Ressources humaines
    Inscrit en
    Février 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 65
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Février 2015
    Messages : 8
    Par défaut convertir decimal en hexa
    Bonjour à tous,
    je bute sur un problème:

    Dans un Form, j'ai une ScrollBar qui me génère des nombres de 1 à 240.
    Comment faire pour transformer ces nombres en hexa et récupérer le résultat dans une variable?

    Le but est d'envoyer des octets sur le port série, afin de piloter une PWM d'arduino.

    J'ai essayé un tas de trucs depuis hier, je n'y arrive pas (précision: je débute en C++).

    D'avance merci!!!!!

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 766
    Par défaut
    Je ne comprends pas la question
    En C/ C++ pour représenter un entier, on a les types suivants: char, unsigned char, short, unsigned short, int, unsigned int, long et éventuellement long long.
    La seule différence c'est leur longueur en octets qui varie ... et qui varie en fonction de la plateforme.
    Seul le char est fixe : 1 octet

    Maintenant, étant donné que tu ne veux pas convertir ton nombre en "chaîne de caractères", tu t'en fiches qu'il soit en décimal, héxa ou octal

    Par contre pour l'envoi octet par octet il faut utiliser les opérateurs logiques & | et les décalages << >>
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int number = XXX;
    unsigned char byte_1 = (number & 0xff);
    unsigned char byte_2 = ((number >>  8) & 0xff);
    unsigned char byte_3 = ((number >> 16) & 0xff);
    unsigned char byte_4 = ((number >> 24) & 0xff);
    Ensuite certains membres ici te recommanderaient d'utiliser les types uintN_t dans l'entête stdint.h

    Moi je préfère travailler qu'avec des tableaux de unsigned char (même si c'est un peu lourd).
    Par exemple: un int devient unsigned char[4].

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Ressources humaines
    Inscrit en
    Février 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 65
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Février 2015
    Messages : 8
    Par défaut
    Je me suis mal exprimé...
    Voilà ce qui me pose problème:
    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
     
    private: System::Void hScrollBar1_Scroll(System::Object^  sender, System::Windows::Forms::ScrollEventArgs^  e) {
    			 this->textBox1->Text = String::Concat( "", (hScrollBar1->Value)*2 , " V" );
     
    			 //pwm1 = (hScrollBar1->Value);
    			 //unsigned char pwm1 = (hScrollBar1->Value & 0xff);
    			 //pwm1 ={0xFE,pwm1};
     
    			this->textBox6->Text = String::Concat( "", pwm1 , "" );
     
    			// fin modif
     
     
    			 //array<unsigned char>^pwm1 ={0xFE,0xF9};
     
     
    			  //serialPort1->Write (pwm1,0,1);
     
    		 }
    j'ai dans hScrollBar1 des valeurs de 1à 240.
    Je ne peux pas écrire 100 sur le port série. Quand bien même je pourrais, je ne peux m'en servir après (les sorties PWM de l'arduino ne comprennent que l'hexa).
    Je souhaiterais donc envoyer un truc du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    array<unsigned char>^pwm1 ={0xFE,hScrollBar1->Value};
    				 serialPort1->Write(canstart,0,2);
    0xFE est la balise de début d'émission, et hScrollBar1->Value la valeur à envoyer. sauf que hScrollBar1->Value n'est pas en hexa. Par exemple, au leu d'envoyer 10, je voudrais envoyer 0A.

    Si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    array<unsigned char>^canstart ={0xFF,(0x54)};
    				 serialPort1->Write(canstart,0,2);
    ça marche. J'ai bien ma balise de début et mon octet en hexa.

    Reste plus qu'à trouver comment remplacer le 0x54 par ce qui sort de ma sCrollBar1.... Et là, je sèche...

    Bonne journée à tous.

  4. #4
    Nouveau membre du Club
    Femme Profil pro
    Ressources humaines
    Inscrit en
    Février 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 65
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Février 2015
    Messages : 8
    Par défaut
    ""Maintenant, étant donné que tu ne veux pas convertir ton nombre en "chaîne de caractères"

    je me demande justement si ce n'est pas la solution...
    Donc question supplémentaire, comment faire pour passer, par ex, de 10(valeur sortie de hScrollBar) à 0A (valeur que je souhaiterais écrire sur le port série)?

  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
    Sur le port série, veux-tu écrire un entier de valeur 0x0A ou la chaine "0A"?

    10 est 0x0A, mais, par défaut, sera écrit "10" dans les flux de sortie non manipulés

  6. #6
    Nouveau membre du Club
    Femme Profil pro
    Ressources humaines
    Inscrit en
    Février 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 65
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Février 2015
    Messages : 8
    Par défaut
    je souhaite écrire 0x0A.

  7. #7
    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
    Alors il n'y a rien à faire. 0x0A est une notation humaine en base 16 de l'entier "dix". 10 est la notation humaine en base 10 du même entier.
    De toutes les façons, l'entier sera écrit en binaire dans l'octet: sa représentation binaire serait 00001010 (2° et 40 bits à 1, les autres à 0)

    La question était de savoir si tu voulais transmettre la représentation ASCII de la chaine (char chaine[] = {49, 48, 0} c'est à dire{'1', '0', '\0'} ou encore "10")

  8. #8
    Nouveau membre du Club
    Femme Profil pro
    Ressources humaines
    Inscrit en
    Février 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 65
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Février 2015
    Messages : 8
    Par défaut
    Je m'explique très mal, probablement parce que j'ai découvert le C++ il y a 3 jours...
    Quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    array<unsigned char>^canstart ={0xFF,(0x01)};
    				 serialPort1->Write(canstart,0,2);
    je mets une sortie PWM de l'arduino à 0,2V env.(1er octet: balise, 2eme: donnée).
    La balise est fixe, seules les données changent.
    Je peux donc envoyer des données de 0x01 à OxFC.

    Si je change mon code à chaque fois (0x01, 0x02........ 0xFC) à la main, ça marche.
    Je souhaiterais juste transformer des chiffres (1, 2, ..... 252) en 0x01, 0x02.... 0xFC pour les envoyer sur le port série sous cette forme...
    Autrement dit, me servir de ma hScrollBar pour commander la sortie PWM de l'arduino...

    C'est suffisamment nébuleux, comme ça??!!

  9. #9
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 766
    Par défaut
    En vitesse:

    Ton bout de code est nébuleux: Pourquoi tu parenthèses 0x01 (ta donnée)? C'est quoi "le chapeau" avant canstart?

    Et ton problème vient sûrement du fait qu'il y a un slicing : tu mets un entier dans un unsigned char.

    Essayes cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int data = 240;
    array<unsigned char> canstart ={0xFF, (data & 0x7f)};
    //or array<unsigned char> canstart ={0xFF, (data & 0xff)};
    serialPort1->Write(canstart,0,2);

  10. #10
    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
    0x0A est une notation. C'est la même valeur que 10. (ou 012 qui est de l'octal, car le nombre commence par un 0).
    Ce sont des littéraux d'entiers.

  11. #11
    Nouveau membre du Club
    Femme Profil pro
    Ressources humaines
    Inscrit en
    Février 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 65
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Février 2015
    Messages : 8
    Par défaut
    Merci, avec cette solution, je n'ai plus d'erreurs à plus en finir..... On progresse...
    J'ai rajouté ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this->textBox6->Text = String::Concat( " ", (canstart) , "V" );
    J'ai un doute, car quand je bouge ma hScrollBar, la valeur dans textBox6 est inexistante... De plus, ma tension variable est.... fixe...

    J'ai encore fait quelque chose de travers, mais quoi???

  12. #12
    Nouveau membre du Club
    Femme Profil pro
    Ressources humaines
    Inscrit en
    Février 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 65
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Février 2015
    Messages : 8
    Par défaut
    en fait, le code complet est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int data = hScrollBar1->Value;
    			array<unsigned char> pwm1 ={0xFE, (data & 0x7f)};
    			//or array<unsigned char> canstart ={0xFF, (data & 0xff)};
    			serialPort1->Write(pwm1,0,2);
                this->textBox6->Text = String::Concat( " ", (pwm1) , "V" );

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Attends, tu programmes en quel langage, au juste?
    • C++?
    • C++ spécial d'Arduino (en gros, ton code est un code embarqué)
    • C++/CLI pour une application Windows Forms? Confondre C++/CLI et C++, c'est comme confondre C++ et C...
    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.

  14. #14
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 766
    Par défaut
    Je dirais même plus avec quel compilateur?

    Parce qu'il semble supprimer la valeur lorsque la taille en octet "de réception" est mauvaise

  15. #15
    Nouveau membre du Club
    Femme Profil pro
    Ressources humaines
    Inscrit en
    Février 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 65
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Février 2015
    Messages : 8
    Par défaut
    Pour la partie PC, je suis sous visual C++ 2010.
    Pour la partie arduino, j'utilise l'IDE de base.
    Débutant pour les deux...

    En fait, j'avais décoché un truc dans le débugueur, il ne prenait pas mes modifs.
    Donc, je vois l'évolution de ma valeur en fonction de la position de ma hScrollBar, et ma tension variable en sortie d'arduino... varie. Si, si.
    De manière très aléatoire, dû certainement à ma méthode pour écrire sur le port série, mais je vais creuser tout ça.

    Vos conseils m'ont été précieux, et je vous en remercie.

    Je vais maintenant essayer d'autres méthodes que serial.write, et essayer de comprendre quelque chose aux tableaux de variables et autres buffers, du pain sur la planche, donc....

    Bonne soirée,,

Discussions similaires

  1. Réponses: 4
    Dernier message: 15/05/2015, 10h22
  2. Probléme pour convertir decimal en hexa
    Par vtk37 dans le forum Débuter
    Réponses: 7
    Dernier message: 19/05/2009, 14h00
  3. Convertir DECIMAL ou HEXA en ASCII
    Par lefebvre.pie dans le forum C++Builder
    Réponses: 13
    Dernier message: 22/02/2007, 16h03
  4. [C#] convertir un nombre hexa en int
    Par linux dans le forum C#
    Réponses: 5
    Dernier message: 08/12/2005, 16h38
  5. [langage] conversion décimal vers hexa
    Par chipster dans le forum Langage
    Réponses: 2
    Dernier message: 23/02/2004, 16h05

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