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