Convertir une " string " reçue en Float !!!

Bonjour , Jutilise depuis peu un arduino uno , je recoit une trame rs 232 "0.1455" par exemple que je loge dans une variable string lecture , et je voudrais comparer cette variable à 0.1 par exemple (reel) . Et la ca marche pas , j'utilise la fonction de conversion float() mais tjrs un bug !!!

comment faire svp merci .

jluc

float() permet de convertir une variable numérique (char, int, ..) en float.
Pour convertir une chaine de caractère en float il faut utiliser atof().

double atof(char *arg);

arg une chaine de caractères. La conversion s'arrête au premier caractère invalide (autre que chiffre ou point)

atof retourne un double donc pour avoir un float il faut convertir

float monChiffre;
char * maChaine;

 .......
 monChiffre = (float) atof(maChaine);

ne pas oublier d'inclure la librairie correspondante : #include <stdlib.h>

ne pas oublier d'inclure la librairie correspondante : #include <stdlib.h>

Il me semble qu'elle est incluse implicitement dans l'environnement de compilation arduino.

Merci a tous , je teste tout cela et vs tiens au courant !!

Aie Aie Aie !
Ca a bien compilé , mais ca ne retourne pas la bonne chaine lue !
Voici mon code :

int sensorValue;
int lect;

float dist;
float vitess;
char * lecture;
int acces;

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

pinMode (12,OUTPUT);
pinMode (11,OUTPUT);
}

void loop() {

if (Serial.available() > 0) {
lect = Serial.read();

if ((acces==2) && (lect==44)){
Serial.print("--");

Serial.print(lecture);
deport();
lecture="";
acces=3;
}

if (acces==2) {
lecture=lecture+char(lect);
//Serial.println(lecture);
//Serial.println(char(lect));
}

if ((acces==1) && (lect==44)){
acces=2;
}

if (lect==36){
acces=1;
lecture="";
}

if (lect==10){
acces=0;
}

if (acces==9) {
acces=0;
}
}// end aviable
}

void deport() {
//float(lecture);
Serial.println(lecture);
dist= (float) atof(lecture);
Serial.println(dist);
//String lecture;
if (dist<(-0,1)) {
digitalWrite(12,HIGH);
digitalWrite(11,LOW);
} else {
if (dist>(0,1)) {

digitalWrite(12,LOW) ;
digitalWrite(11,HIGH);
} else {
digitalWrite(12,LOW);
digitalWrite(11,LOW);

}

}

}

Merci de vos conseils
jlpic

le code :

lecture=lecture+char(lect);

n'a pas de sens en C, en tout cas pas le sens attendu ici.

lecture est un pointeur vers un caractère
lecture + char(lect) incrémente le pointeur d'un nombre de bytes égal au code du caractère.

il faut explicitement définir la zone d'allocation de la chaîne :

char[32] buff;

et remplacer lecture="" par lecture=buf;

alors on pourra écrire :

*lecture++ = char(lect);

bien sur, il vaut mieux vérifier que l'on ne dépasse pas la taille allouée pour le tableau.

char[32] buff ou plutôt
char buff[32] ?

Bonjours,

char buff[32]; pour allouer un tableau de char
Sinon pour atof() normalement il ne faut pas que la chaine ce finisse par '\0' (caractère null) ?

Sinon pour atof() normalement il ne faut pas que la chaine ce finisse par '\0' (caractère null) ?

Ben si comme toutes les chaines en C.

Je code en c++ mfc, l'objet CString est tellement classique que on finit par oublié les bonnes vielles base XD
N'entendant pas parler du caractère null je me posé des questions.

Merci encore,
La chaine se change bien en float , mais les soucis ne sont pas finis !!!
en effet , la procedure de comparaison ne marche pas , les diodes clignottent !
Voici le code :

void deport() {
//float(lecture);
Serial.println(lecture);
dist= (float) atof(lecture);
Serial.println(dist);
//String lecture;
if (dist < -0,2) {
Serial.println("moins");
digitalWrite(12,HIGH);
digitalWrite(11,LOW);
}
if (dist > 0,2) {
Serial.println("plus");
digitalWrite(12,LOW) ;
digitalWrite(11,HIGH);
}
if ((dist > -0.2) && (dist < 0.2)) {
Serial.println("egal");
digitalWrite(12,LOW);
digitalWrite(11,LOW);
}

}

help !!!

Dis nous à quel endroit ton code ne fonctionne pas.

Est-ce-que atof() te retourne la bonne valeur ?

Sinon ton code semble correcte. donnes nous plus d'info sur ce qui ne tourne pas rond pour toi.

A+

En tout les cas c est bien d'avoir votre appui !
Ben oui le buffer se charge et est converti en la variable ( float) dist .
Cette variable est soit positive soit negative .
Je voudrais que si elle est negative (<-0.2 ) elle allume la led 12 et si elle est positive elle allume la led 11 (> 0.2 ) , entre les 2 les leds eteintes !

Et en fait c'est tjrs la led 11 qui reste allumée ...

Merci

a+

Si tu envoies des chaines connues est-ce que le comportement est cohérent?

Au passage dans tes tests tu exclus 0.2 et -0.2 ce qui conduit à un état indéterminé dans ces cas (en fait on conserve l'état précédent).Il faudrait changer tes tests

 if (dist < -0.2) {
     Serial.println("moins");
     digitalWrite(12,HIGH);
     digitalWrite(11,LOW);
 } else if (dist > 0.2) {
     Serial.println("plus");
     digitalWrite(12,LOW) ;
      digitalWrite(11,HIGH);
} else {
     Serial.println("egal");
     digitalWrite(12,LOW);
     digitalWrite(11,LOW);
}

Objectif atteint !!!

Merci les gars !!!

En fait , c'était un probleme de syntaxe entre "." et "," !!!

Et oui il en faut peu

merci encore et a la prochaine !!!

L'arduino est vraiement super !!!

jlpic

Tu veux dire que la bonne syntaxe est :

if (dist < -0,2) et non if (dist < 0.2) ????

Pour moi (selon ma mémoire) le language C utilise '.' pour les float/double et non ',' .

Serait-ce le compilateur qui s'adapterait à la notation française ?...

Tu veux dire que la bonne syntaxe est :

if (dist < -0,2) et non if (dist < 0.2) ????

Non mais dans son source il avait mixé la notation avec un point et avec une virgule. Je ne m'en étais même pas aperçu en recopiant son bout de code pour corriger les tests (je viens de mettre à jour).