Convertisseur binaire vers hexadecimal

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 :slight_smile:

Merci d'avance pour votre aide !

  • 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
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).

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?

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?

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

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 :slight_smile: )

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)

J-M-L:
é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 ?

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

Woxet:
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

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).

??????????????????

Alain46:
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.

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

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 ^^'

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

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... :confused:

Woxet:
Eh bien j'ai lu les forums en rapport mais je n'ai pas trouvé le moyen d'importer des fichiers... :confused:

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

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

[sub][color=purple]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
[color=blue]Resultat =  0xAC
Resultat =  B10101100
Chaine   =  B10101100[/color]
[/color][/sub]

ça semble pas mal :slight_smile:

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

Capture2.PNG

il faut quand même la bonne ligne de code... je ne vais pas l'écrire pour vous :slight_smile:

Hier, j'ai essayé de développer avec la fonction pow(2,n), ce programme a un petit problème :3 Donc, s'il vous plaît, dites moi juste si il peut être corrigeable et donc donc optimisable, sinon ne vous embêtez pas et laissez tomber :wink:

char incomingByte = "";   // for incoming serial data
double n0 = 0;
double n1 = 0;
double n2 = 0;
double n3 = 0;
double n4 = 0;
double n5 = 0;
double n6 = 0;
double n7 = 0;
double n8 = 0;

void setup() 
{
  Serial.begin(9600);     // opens serial port, sets data rate to 9600 bps
}

void loop() 
{      
        if (Serial.available()>0) // send data only when you receive data:
          { 
          incomingByte = Serial.read(); // read the incoming byte:
          Serial.println(incomingByte);
          if(incomingByte.substring(8,9)=="")
            {
            n0 = pow(2,0);
            Serial.println(n0);
            }
          else
            {
            n0 = 0;
            }
          if(incomingByte.substring(7,8)==49)
            {
            n1 = pow(2,1);
            Serial.println(n1);
            }
          else
            {
            n1 = 0;
            }
          if(incomingByte.substring(6,7)==49)
            {
            n2 = pow(2,2);
            Serial.println(n2);
            }
          else
            {
            n2 = 0;
            }
          if(incomingByte.substring(5,6)==49)
            {
            n3 = pow(2,3);
            Serial.println(n3);
            }
          else
            {
            n3 = 0;
            }
          if(incomingByte.substring(4,5)==49)
            {
            n4 = pow(2,4);
            Serial.println(n4);
            }
          else
            {
            n4 = 0;
            }
          if(incomingByte.substring(3,4)==49)
            {
            n5 = pow(2,5);
            Serial.println(n5);
            }
          else
            {
            n5 = 0;
            }
          if(incomingByte.substring(2,3)==49)
            {
            n6 = pow(2,6);
            Serial.println(n6);
            }
          else
            {
            n6 = 0;
            }
          if(incomingByte.substring(1,2)==49)
            {
            n7 = pow(2,7);
            Serial.println(n7);
            }
          else
            {
            n7 = 0;
            }
         //if(incomingByte.substring(0,1)==49)
            {
            n8 = pow(2,8);
            Serial.println(n8);
            }
          else
            {
            n8 = 0;
            }
         }
}

c'est corrigeable - suffit de tout re-écrire :slight_smile:

par exemple quel est le type de incomingByte et donc quand vous essayez de faire incomingByte.substring(8,9)que pensez vous que le compilo va dire?

vite comme ça je dirais de chercher sur google et essayer des fonctions en langage C qui converti à ta place.. style binary to hex c function

J-M-L:
c'est corrigeable - suffit de tout re-écrire :slight_smile:

par exemple quel est le type de incomingByte et donc quand vous essayez de faire incomingByte.substring(8,9)que pensez vous que le compilo va dire?

Théoriquement, ce code est censé encadrer un caractère (donc soit un 1 ou un 0) puis il le met dans une variable n puis il le met à la puissance 2. Après il aurait fallut que je le modifie pour qu'il fasse la somme de tout pour obtenir la valeur décimale de la chaîne entrante.