Go Down

Topic: [Résolu]Conversion float en char (Read 12918 times) previous topic - next topic

fsxonarduino

Jan 07, 2014, 02:58 pm Last Edit: Jan 08, 2014, 03:27 pm by fsxonarduino Reason: 1
Bonjour
Je cherche à convertir un float (récupéré à partir d'un encodeur rotatif) en char pour pouvoir l'afficher sur 5 afficheurs 7 segments
(les valeurs vont de 118.00 à 136.00)

Le code C suivant fonctionne bien :
Code: [Select]
#include <stdio.h>

int main(int argc, const char * argv[])
{

   float x = 125.65;
   char buffer[20];
   sprintf(buffer, "%f", x);
   printf("%c\n", buffer[0]);
   printf("%c\n", buffer[1]);
   printf("%c\n", buffer[2]);
   printf("%c\n", buffer[3]);
   printf("%c\n", buffer[4]);
   printf("%c\n", buffer[5]);
   
   return 0;
}


J'ai essayé de l'adapté pour le C arduino comme ça :
Code: [Select]
#include <stdio.h>
int x = 125;
char buffer[7];

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

sprintf(buffer, "%d", x);
Serial.print(printf("%s\n", buffer[0]));
Serial.print(printf("%s\n", buffer[1]));
Serial.print(printf("%s\n", buffer[2]));
Serial.print(printf("%s\n", buffer[3]));
Serial.print(printf("%s\n", buffer[4]));
Serial.print(printf("%s\n", buffer[5]));

Serial.println ();

}


Ca ne fonctionne pas, sur la console, je ne récupère que "-1 -1 -1 -1 -1 -1

Quelqu'un aurait une idée ?
Merci

XavierMiller

c'est logique : printf retourne un INT qui indique comment tout s'est passé.

fais simplement

Serial.print(buffer[0]);

fsxonarduino

Merci ça fonctionne
Mais c'était juste un test avec un int

J'ai donc modifié le code avec un float
Code: [Select]
#include <stdio.h>
float x = 125.45; // au lieu de int x = 125
char buffer[7];

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

sprintf(buffer, "%f", x); // %f au lieu de %d
Serial.print(buffer[0]);
Serial.print(buffer[1]);
Serial.print(buffer[2]);
Serial.print(buffer[3]);
Serial.print(buffer[4]);
Serial.print(buffer[5]);

Serial.println ();

}


Maintenant je n'ai que des ? sur la console

fsxonarduino


B@tto

Essaye :

sprintf(buffer, "%6.2f", x);
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

fsxonarduino

Nan, marche poa

erreur : no matchin function for call to 'HardwareSerial::print(char[7], const char[6], float&)


XavierMiller

on a dit sprintf, pas Serial.sprintf ;)

fsxonarduino

toutes mes excuses
je vais essayer
je vous dit quoi !!!

fsxonarduino

Il y a du mieux
voila mon dernier code

Code: [Select]
#include <stdio.h>
float x = 125.45;
char buffer[7];

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

sprintf(buffer, "%d", (char)x);
//
Serial.print(buffer[0]);
Serial.print(buffer[1]);
Serial.print(buffer[2]);
Serial.print(buffer[3]);
Serial.print(buffer[4]);
Serial.print(buffer[5]);

Serial.println ();
delay(500);

}


Mais je ne récupère que que les 3 chiffres avant la virgule
Any sugestions ?

XavierMiller

- tu transformes ton float en entier (char)
- tu utilises %d pour afficher un entier.

C'est donc normal.

utilise plutôt %f, comme préconisé plus tôt dans ce sujet.

Carolyne

Si tu ne t'en sort pas; sépare la partie entière des décimales que tu traitera comme deux entiers.
Et tu affiche:
serial.print(partie_entière) //pas de retour ligne
serial.print( "  ,  ") //pas de retour ligne
serial.println(partie_décimale) //retour ligne

B@tto


- tu transformes ton float en entier (char)
- tu utilises %d pour afficher un entier.

C'est donc normal.

utilise plutôt %f, comme préconisé plus tôt dans ce sujet.


+1

je comprend pas, on te donne %f et tu reposte avec un %d .... on peut continuer longtemps comme ça
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

fsxonarduino

Euh !!
Je sépare comment la partie entiere de la partie décimale ?

Pour répondre à la réponse précedente, "%f" ne fonctionne pas, ça ne me renvoi un "?"

B@tto

#13
Jan 08, 2014, 03:11 pm Last Edit: Jan 08, 2014, 03:13 pm by B@tto Reason: 1
Et %6.2f ?

Sinon pour séparer c'est pas difficile : si je prend x=125.45 :

Code: [Select]
int Ent= int (x);  // Ent = 125
int Fract=abs(x*100-Ent*100); // Fract = |(128.45*100)  - (128*100)|= |(12845-12800)| = 45   abs() pour le cas ou x < 0
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

fsxonarduino

Merci les amis
J'ai trouvé la solution avec la librairie PString de Mikal Hart
http://arduiniana.org/libraries/PString

Voila le code
Code: [Select]
#include <PString.h>

float x=125.55;
char buffer[20];

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

void loop(){
PString mystring(buffer, sizeof(buffer));
mystring.print(x);

Serial.print(buffer[0]);
Serial.print(buffer[1]);
Serial.print(buffer[2]);
Serial.print(buffer[3]);
Serial.print(buffer[4]);
Serial.print(buffer[5]);

Serial.println ();
delay(500);
}

Go Up