Go Down

Topic: Convertisseur binaire vers hexadecimal (Read 2292 times) previous topic - next topic

J-M-L

il faut quand même la bonne ligne de code... je ne vais pas l'écrire pour vous :)
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Woxet

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

Code: [Select]
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;
            }
         }
}

J-M-L

#17
Jan 14, 2018, 12:04 pm Last Edit: Jan 14, 2018, 12:40 pm by J-M-L
c'est corrigeable - suffit de tout re-écrire :)

par exemple quel est le type de incomingByte et donc quand vous essayez de faire
Code: [Select]
incomingByte.substring(8,9)que pensez vous que le compilo va dire?
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

TTTTT

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

Woxet

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

par exemple quel est le type de incomingByte et donc quand vous essayez de faire
Code: [Select]
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.

J-M-L

Quote
Théoriquement
... il pourrait aussi servir à générer des bitcoins et séquencer l'ADN... en pratique il ne le fait pas - ça ne compile même pas, n'est-ce pas? vous avez des erreurs du genre
error: request for member 'substring' in 'incomingByte', which is of non-class type 'char'
     if (incomingByte.substring(8, 9) == "")


pour pouvoir utiliser la méthode substring() il faut que la variable sur laquelle vous appliquez l'appel soit du bon type - ici donc il faudrait que ce soit une instance de la classe String - hors c'est juste un seul caractère tout seul (type char)... donc zéro chance pour que ça fonctionne...

essayez donc de trouver la ligne qui manque dans mon code.

--> comment lire un des caractères dans mon tableau chaine par exemple celui à la position 2 ou 3 ou x ?
--> comment comparer ce caractère obtenu avec le caractère 1 (ASCII) par exemple?
--> que faire pour résultat si on a trouvé un '1' ?


Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Woxet

Bonjour bonjour,

J'ai eu d'autres projets durant la semaine, je me suis réintéressé au code et j'ai trouvé la solution !!!!

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(9600);

  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-i);

    // une seule ligne de code manque ici :) pour faire simple
    resultat = resultat + (chaine[7-i]-48)*n;
 
    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() {}


Ce qui fait donc que j'ai rajouté la ligne
Code: [Select]
resultat = resultat + (chaine[7-i]-48)*n;

Du coup, J-M-L est-ce bien la ligne que vous avez développé ?

J-M-L

#22
Jan 18, 2018, 03:39 am Last Edit: Jan 18, 2018, 03:41 am by J-M-L
Oui, ça devrait le faire... (au lieu de -48 il faudrait écrire -'0' pour la lisibilité)

on peut faire plus efficace
Code: [Select]
if (chaine[7-i] == '1') resultat+=n;
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Woxet

#23
Jan 18, 2018, 12:04 pm Last Edit: Jan 18, 2018, 12:16 pm by Woxet
J'ai un léger souci... Voici mon code, lorsque j'introduis le convertisseur

Code: [Select]
  String code = ""; // variable pour la chaine de caractère représentant la tramec omplète(qui peut être de longueur supérieure à 4 bits)
  //String chaine=""; // variable pour la chaine de caractère
  //doublenombre=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))
  //intnombreEntier=0; // variable pour conversion de la variable "nombre" en un nombre décimal entier pour la conversion qui suit en hexadécimal
  int lu = Serial.read(); // variable pour la réinitialisation de Processing (caractère reçu : "-" ou "R")
  unsigned long n=1;
  unsigned long resultat=0;
  unsigned long debutImpulsion=0;
  unsigned long topTrame=0;
  unsigned long lastTopTrame=0;
  const byte longueurChaine = 10; //Max 32
  char chaine[longueurChaine + 1] = code;

void setup(){Serial.begin(9600);}

void loop(){
  topTrame = micros();
  lastTopTrame = topTrame;
  if(analogRead(A0)>300){
    while(micros()-topTrame <=24000){ // Le 24000 correspond à la largeur du signal
      if(analogRead(A0)<950){
        if(analogRead(A0)>300){
          debutImpulsion=micros(); // On est sur un niveau haut juste après le front montant : on "déclenche le chrono"!
          while(analogRead(A0)>300){
            if(micros()-lastTopTrame>1500){ // Le 1500 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>1500){
            if(code.length()!=0){ // Sécurité pour ne pas commencer la chaîne binaire par 0
              code = code + "0";
              delay(1);
              lastTopTrame=micros();
            if(micros()-topTrame>24000)
              break;
            }
          else{topTrame=micros();}
          }
        }
      }
      else{Serial.println("*/");}
    }
  }
  if(longueurChaine == 10){
    for(byte i=0; i<longueurChaine; i++){ // Partie du code pour la conversion de la chaine en un caractère hexadécimal
      if (chaine[longueurChaine + 1 - i] == '1') resultat+=n;{
        n=2*n;//ou on peut écrire n<<=1; //Bitwise left shift assignment
      }
    }
    Serial.print("Resultat = ");Serial.println(resultat);
    Serial.print("Resultat = 0x");Serial.println(resultat, HEX);
  }
  if(Serial.available()>0){Serial.println(lu + " /");} // "R" ou "-" reçu de Processing
  chaine[11] = "";
  code = "";
  lu = "";
  delay(000);
}


Arduino me met le message d'erreur "array must be initialized with a brace-enclosed initializer" pour cette ligne
Code: [Select]
char chaine[longueurChaine + 1] = code;

Comment puis-je corriger ceci sans que ça influe sur tout le code ?

J-M-L

#24
Jan 18, 2018, 12:13 pm Last Edit: Jan 18, 2018, 12:14 pm by J-M-L
Je vous ai dit de ne pas utiliser la classe String...vous avez lu ce que j'ai posté plus haut au post #5 ?

 ne prenez que des cstring, un tableau de char terminé par '\0' ou dans votre cas comme ce que vous voulez c'est juste mémoriser des caractères juste un tableau de caractères et Au lieu de faire
Code: [Select]
if(micros()-lastTopTrame>1500){ // Le 1500 correspond à la largeur d'une trame
              code = code + "1";
...
vous mettez le caractère '1' dans le tableau au bon endroit (la prochaine case libre)- idem pour les '0'
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Woxet

Ceci fait partis du code de base que j'ai reçu, je ne veux donc pas trop m'étendre pour éviter de me perdre voyez vous ^^'

J-M-L

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Woxet


J-M-L

Et donc vous lui avez fait lire le document sur la classe String?
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

Go Up