Go Down

Topic: Convertisseur binaire vers hexadecimal (Read 1 time) previous topic - next topic

Woxet

Salut à tous !
Comme vous l'avez lu je cherche à faire une conversion d'un String en binaire vers un code hexadécimal.

Le principe de mon code en entier est de récupérer le signal d'une télécommande que je convertis en une chaîne de caractère en binaire (j'ai réussis cette partie). Maintenant je dois justement traduire cette chaîne en un code hexadécimal que j'envoie sur Processing.

J'ai une étape intermédiaire à respecter qui est de convertir le binaire en décimal avec la fonction pow(2,n) puis prendre cette décimal et passer en hexadécimal.

Si vous avez besoin de précisions demandez :)

Merci d'avance pour votre aide !

J-M-L

#1
Jan 13, 2018, 06:24 pm Last Edit: Jan 13, 2018, 06:24 pm by J-M-L
- postez déjà votre code (avec les balises)
- donnez un exemple de la string que vous avez en tête et de la représentation que vous souhaitez obtenir
Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

Woxet

#2
Jan 13, 2018, 06:30 pm Last Edit: Jan 13, 2018, 06:48 pm by Woxet
Code: [Select]
String code="" ;         // variable pour la chaine de caractère représentatnt la trame complète (qui peut être de longueur supérieure à 4 bits)
String chaine="";        // variable pour la chaine de caractère sur 4 bits 
String dec="";
double nombre=0;         // variable pour la conversion de la partie interressante du code en décimal (déclaration en type double car obligatoire avec la fonction puissance de 2 : pow(2, nombre) )
int nombreEntier=0;      // variable pour conversion de la variable "nombre" en un nombre décimal entier pour la conversion qui suit en hexadécimal
unsigned long debutImpulsion=0;
unsigned long topTrame=0;
unsigned long lastTopTrame=0;

void setup() {
  Serial.begin(9600);
  pinMode(6, OUTPUT);   
  pinMode(12, OUTPUT);   
  }

void loop()
{
  topTrame = micros();
  lastTopTrame = topTrame;
  if(analogRead(A0)>300) {
  while(micros()-topTrame<=24000) { //Le 24000 correspond à la largeur du signal
    digitalWrite(12, LOW);
    if(analogRead(A0)>950)
      {
      Serial.println("*/");
      }
      else
      {
    if(analogRead(A0)>300) { 
      debutImpulsion = micros(); // on est sur un niveau haut juste après le font montant : on "déclenche le chrono" !
        while (analogRead(A0)>300){
          if(micros()-lastTopTrame>2000) {//Le 1 correspond à la largeur d'une trame
          code = code+"1";
          delay(1);
          lastTopTrame = micros();
          if(micros()-topTrame>24000)
          break;                 
        }
     }
  }
  while(analogRead(A0)<=300) {
      if(micros()-lastTopTrame>2000) {
        if(code.length()!=0){
        code = code+"0";
        delay(1);
        lastTopTrame = micros();
        if(micros()-topTrame>24000)
        break;               
      }
      else{
        topTrame = micros();
     }
    }
  }
  }
  }
  }
  int longueurChaine = code.length();
  if(longueurChaine==8){
  Serial.print("code touche : ");
  Serial.println(code);
  Serial.print ("longueurChaine :");
  Serial.println (longueurChaine);
  }
  for(int i=0; i<=3; i++) {
    chaine = chaine + code[i];
  }

//Partie du code pour la conversion de la chaine en un caractère hexadécimal à intégrer ici

//R reçu par Processing
if (Serial.available())
  {
  int lu = Serial.read();
  Serial.println(lu+"/");
  }
  chaine="";
  code="";
  }
 


Eh bien, admettons que j'obtiennes un code binaire 10100000, dans le code il faudrait par exemple le traduire en 10 (par exemple même si ce n'est pas le bon résultat) puis que ce 10 je le traduise en hexadécimal pour par exemple obtenir un code comme D16 (encore une fois je sais que ce n'est pas le bon résultat).

J-M-L

#3
Jan 13, 2018, 06:32 pm Last Edit: Jan 13, 2018, 06:36 pm by J-M-L
en binaire chaque case est une puissance de 2... donc il suffit de parcourir la chaîne de droite à gauche (ou gauche à droite, ça dépend comment vous avez représenté votre nombre - généralement le bit de poids faible est à droite) et quand vous voyez un 1 vous ajoutez à votre nombre la puissance de 2 correspondante à cette position

évitez d'utiliser la classe String...

c'est ridicule de vouloir utiliser un double pour représenter un entier - jusqu'à combien vous compter devoir monter?
Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

Woxet

#4
Jan 13, 2018, 06:53 pm Last Edit: Jan 13, 2018, 07:08 pm by Woxet
en binaire chaque case est une puissance de 2... donc il suffit de parcourir la chaîne de droite à gauche (ou gauche à droite, ça dépend comment vous avez représenté votre nombre - généralement le bit de poids faible est à droite) et quand vous voyez un 1 vous ajoutez à votre nombre la puissance de 2 correspondante à cette position

évitez d'utiliser la classe String...

c'est ridicule de vouloir utiliser un double pour représenter un entier - jusqu'à combien vous compter devoir monter?
Pourquoi ne pas utiliser de String ?
Eh bien, je n'ai pas trop le choix c'est ce qui m'a été imposé :3

Du coup, est-ce qu'il existe une fonction ou quelques lignes de code qui me permettrait d'extraire un caractère donc ici le "1" ou le "0", que je nommerais "n", de ma chaîne puis ensuite utiliser pow(2,n) ?

Personnellement ma chaîne à une longueur de 8 caractères

J-M-L

#5
Jan 13, 2018, 07:34 pm Last Edit: Jan 13, 2018, 07:37 pm by J-M-L
Quote
Eh bien, je n'ai pas trop le choix c'est ce qui m'a été imposé :3
par qui ? si c'est votre prof, dites lui de lire ceci (lisez le aussi :) )

Maintenant il se peut que votre prof ait plutôt en tête une cString, soit un tableau de caractère qui est terminé par un caractère nul '\0'

Si vous persistez à utiliser la classe String - lisez les méthodes de cette classe  String et vous verrez qu'il y en a pour aller extraire une sous chaîne ou une autre pour lire un caractère à un endroit  (mais si vous utilisez un tableau - et en plus vous connaissez sa taille, c'est un simple index dans le tableau)

évitez de faire pow(2,n).. conservez simplement une variable qui à chaque fois que vous vous décalez d'un cran pour lire le caractère suivant est multipliée par 2 et ça construit au fur et à mesure votre puissance (ou utiliser l'opérateur << puisque en binaire quand on décale les bits vers la gauche, on multiplie par 2, donc 3 décalages c'est comme si on multipliait par 23)
Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

Woxet

évitez de faire pow(2,n).. conservez simplement une variable qui à chaque fois que vous vous décalez d'un cran pour lire le caractère suivant est multipliée par 2 et ça construit au fur et à mesure votre puissance (ou utiliser l'opérateur << puisque en binaire quand on décale les bits vers la gauche, on multiplie par 2, donc 3 décalages c'est comme si on multipliait par 23)
C'est à dire ?

J-M-L

#7
Jan 13, 2018, 11:10 pm Last Edit: Jan 14, 2018, 07:18 am by J-M-L
Code: [Select]

const byte nombreDeBits = 8; // Max 32
unsigned long n = 1;
unsigned long resultat = 0;
char chaine[nombreDeBits+1] = "10101100";

for (byte i = 0; i < nombreDeBits; i++) {
   Serial.print("2 puissance "); Serial.print(i); Serial.print(" = "); Serial.println(n);
   Serial.print("Lecture du bit "); Serial.println(nombreDeBits-1-i);

   // ==============================================
   // des trucs appropriés doivent aller ici pour traiter la chaîne de caractères
   // si le caractère en position (nombreDeBits-1-i) est '0' on fait ????
   // si c'est '1' Alors on ajoute quelque chose de pertinent à resultat
   // ==============================================

   n = 2*n; // ou on peut écrire  n <<= 1; // Bitwise left shift assignment
}
Serial.print("Resultat =  0x"); Serial.println(resultat, HEX);


Merci de travailler sur le bout de code manquant et des poster votre code

Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

Alain46

C'est à dire ?
On te retourne la question
On ne sait toujours pas ce que tu veu faire

Tu as quoi comme valeur au départ ?
Tu veu obtenitr quoi comme valeur à l'arrivée ?
Faut-il utiliser un algorythme (ou formule magique, ou traitement quelconque, ... appelle ça comme tu veu) pour passer de l'un à l'autre ?

En sachant qu'au préalable un µcontrolleur et le langage C ne connaissent que le binaire
La représentation en hexadécimal ou sous forme de chaine de caratère n'existe que pour le confort de lecture d'un humain

Quote
Eh bien, admettons que j'obtiennes un code binaire 10100000, dans le code il faudrait par exemple le traduire en 10 (par exemple même si ce n'est pas le bon résultat) puis que ce 10 je le traduise en hexadécimal pour par exemple obtenir un code comme D16 (encore une fois je sais que ce n'est pas le bon résultat).
??????????????????
Un programme qui se compile sans erreur n'est pas forcément un programme qui fonctionne.

Woxet

On te retourne la question
On ne sait toujours pas ce que tu veu faire

Tu as quoi comme valeur au départ ?
Tu veu obtenitr quoi comme valeur à l'arrivée ?
Faut-il utiliser un algorythme (ou formule magique, ou traitement quelconque, ... appelle ça comme tu veu) pour passer de l'un à l'autre ?

En sachant qu'au préalable un µcontrolleur et le langage C ne connaissent que le binaire
La représentation en hexadécimal ou sous forme de chaine de caratère n'existe que pour le confort de lecture d'un humain
??????????????????
J'ai un poly à ma disposition, dessus j'ai 2 capture d'écran, une qui me montre le développement du code et une autre le résultat final. Au besoin je peux vous les recopier ou indiquez moi de quelle manière je peux vous introduire le poly dans le forum.

De plus, j'ai déja indiqué ce que je voulais obtenir.

J-M-L

#10
Jan 14, 2018, 09:47 am Last Edit: Jan 14, 2018, 09:48 am by J-M-L
Répondez à la question du post #7

Pour savoir comment poster des images et utiliser le forum - vous devriez déjà avoir ou les posts épinglés en haut du forum....
Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

68tjs

Tu as peut être répondu a la question mais visiblement personne ici n'as compris que tu l'ai fait.

Je suis sans aucun doute de la vieille école mais quand je vois ce type de réponse je n'ai aucune envie de répondre.

Je ne sais pas bien si tu l'a remarqué mais ce n'est pas nous qui sommes à l'origine de la question mais c'est toi le demandeur.

Donc si tu veux des réponses et de l'aide il va falloir y mettre du tien.

Woxet

Le principe de mon code en entier est de récupérer le signal d'une télécommande que je convertis en une chaîne de caractère en binaire (j'ai réussis cette partie). Maintenant je dois justement traduire cette chaîne en un code hexadécimal que j'envoie sur Processing.

J'ai une étape intermédiaire à respecter qui est de convertir le binaire en décimal avec la fonction pow(2,n) puis prendre cette décimal et passer en hexadécimal.
J'ai précisé ici ce que je voulais :3
Désolé si je ne me suis pas montré assez clair ^^'

Répondez à la question du post #7

Pour savoir comment poster des images et utiliser le forum - vous devriez déjà avoir ou les posts épinglés en haut du forum....
Je suis entrain d'essayer de développer la partie que vous m'avez laissé ^^'
Eh bien j'ai lu les forums en rapport mais je n'ai pas trouvé le moyen d'importer des fichiers... :/

J-M-L

#13
Jan 14, 2018, 10:33 am Last Edit: Jan 14, 2018, 10:39 am by J-M-L
Eh bien j'ai lu les forums en rapport mais je n'ai pas trouvé le moyen d'importer des fichiers... :/
il faut lire Bien editer son post pour les nuls et suivre le lien vers le Tuto international!

n'hésitez pas à poster votre sketch (avec le setup() et la loop() pour que ce soit exécutable quand vous aurez fini

Code: [Select]
const byte nombreDeBits = 8; // Max 32
unsigned long n = 1;
unsigned long resultat = 0;
char chaine[nombreDeBits + 1] = "10101100";

void setup() {
  Serial.begin(115200);

  for (byte i = 0; i < nombreDeBits; i++) {
    Serial.print("2 puissance "); Serial.print(i); Serial.print(" = "); Serial.print(n);
    Serial.print("  -  Lecture du bit "); Serial.println(nombreDeBits - 1 - i);

    // une seule ligne de code manque ici :) pour faire simple

    n = 2 * n; // ou on peut écrire  n <<= 1; // Bitwise left shift assignment
  }
  Serial.print("Resultat =  0x"); Serial.println(resultat, HEX);
  Serial.print("Resultat =  B"); Serial.println(resultat, BIN);
  Serial.print("Chaine   =  B"); Serial.println(chaine);
}

void loop() {}


avec la bonne ligne de code, la console m'affiche

2 puissance 0 = 1  -  Lecture du bit 7
2 puissance 1 = 2  -  Lecture du bit 6
2 puissance 2 = 4  -  Lecture du bit 5
2 puissance 3 = 8  -  Lecture du bit 4
2 puissance 4 = 16  -  Lecture du bit 3
2 puissance 5 = 32  -  Lecture du bit 2
2 puissance 6 = 64  -  Lecture du bit 1
2 puissance 7 = 128  -  Lecture du bit 0
Resultat =  0xAC
Resultat =  B10101100
Chaine   =  B10101100



ça semble pas mal :)
Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

Woxet

#14
Jan 14, 2018, 10:45 am Last Edit: Jan 14, 2018, 11:16 am by Woxet
Merci beaucoup J-M-L pour ton aide, je vais essayer de ce pas ! Et merci aussi de m'avoir dirigé vers le forum international, c'est le seul que j'ai pas lu ^^' Maintenant je sais comment mettre des images merci beaucoup !

Donc voici les captures d'écrans que mon prof m'a donné afin que je développe mon code, puis le résultat final que je dois avoir sur Arduino une fois "optimisé" si je peux dire ^^

Go Up