[Software Serial] Récupérer un Float

Bonjour

J'ai un peu honte :smiley: ... Je n'arrive pas à récupérer un float sur un port série :frowning:

Concrètement, j'ai une Pro Mini qui envoie une valeur de type float à une Uno .
La liaison est faite avec Software Serial .

J'arrive à envoyer et décoder des Int (sauf que je n'ai pas le signe donc décodage pas terrible )mais pas des Float ...

Le code côté recepteur :

Je cherche à rattacher la valeur reçue à ma variable angle qui est de type float également :

//...

  String inString = "";

  while (FromProMini.available() > 0)
  {
    float inChar = FromProMini.read();
    //angle = inChar ;
    
    if (isDigit(inChar))
    {
      inString += (char)inChar;
    }
    if ((inChar == '\n') )//&& (inString.toInt() >= 5))
    {
     angle = inString.toFloat();
   //  angle = angle - 1000;
     inString = "";
    }

  }

//....

Si qqun a une piste ... :wink:

Merci d'avance

Bonne soirée

Bonjour,

  • Pourquoi déclarer inChar comme float
    float inChar = FromProMini.read();

read retourne un int

  • Tu ne mémorises pas le point décimal.

  • Si tu essaies de lire les caractères plus vite que l'émetteur ne transmet ça ne va pas marcher.

Tu peux simplifier ton programme

//...

  String inString = "";

  if (FromProMini.available() > 0)
  {
    inString=FromProMini.readStringUntil('\n');
     angle = inString.toFloat();
  }

//....

Il serait préférable de ne pas utiliser de String, mais des c_string (char[]).

//...

  char inString[20];

  if (FromProMini.available() > 0)
  {
    int n=FromProMini.readBytesUntil('\n', inString, sizeof inString-1);
    inString[n]='\0';     // marque de fin de chaine
    angle = atof(inString);
  }

//....

Tu peux aussi utiliser parseFloat().

BrUnO14200:
j'ai une Pro Mini qui envoie une valeur de type float à une Uno .

En lisant ceci, moi je comprends qu'un float est envoyé au format binaire, sur 4 octets.
En voyant le code, je comprends que c'est une chaine de caractères qui circule, elle représente un nombre réel (et non pas un float).
Rhhaaaa, le vocabulaire...

@biggil : moi et les types de variables, ça fait 3 ou 4 :smiley:

kamill:
Bonjour,

  • Pourquoi déclarer inChar comme float
    float inChar = FromProMini.read();

read retourne un int

  • Tu ne mémorises pas le point décimal.

  • Si tu essaies de lire les caractères plus vite que l'émetteur ne transmet ça ne va pas marcher.

Tu peux simplifier ton programme

//...

String inString = "";

if (FromProMini.available() > 0)
  {
    inString=FromProMini.readStringUntil('\n');
    angle = inString.toFloat();
  }

//....




Il serait préférable de ne pas utiliser de String, mais des c_string (char[]).


//...

char inString[20];

if (FromProMini.available() > 0)
  {
    int n=FromProMini.readBytesUntil('\n', inString, sizeof inString-1);
    inString[n]='\0';    // marque de fin de chaine
    angle = atof(inString);
  }

//....




Tu peux aussi utiliser parseFloat().

Merci , Kamill, ça marche , je reçevais bien des floats négatifs et positifs mais pas la partie après la virgule..
J'ai multiplié la valeur par 100 à l'envoi puis je la divise par 100 à la réception pour "tricher" .. c'est moche mais ça fonctionne :wink:

Merci à vous 2 !