convert double/float to hexadecimal

Les cartes Arduino, les platines

convert double/float to hexadecimal

Message non lude prokium » Dim 17 Juil 2016 16:06

Bonjour,

Je souhaite transformer un double/float en hexadecimal.
Malgré de nombreuses recherches et essais je n'ai rien trouvé de fonctionnel...
La problématique se situe sur la partie décimale.

Pour les nombres entiers un simple (...)
Code: Tout sélectionner
String(monEntier, HEX);

(...) suffit.

Je pensais voir pour séparer sous la forme de deux "int" le nombre à virgule en splitant la partie entière de la partie décimale... ou en déplaçant la virgule (exemple => 15.56 deviendrait 1556) ... Mais cela me semble un peu bourrin...

Ces données seront ensuite envoyées par SIGFOX.
Des idées?
Bonne journée
Benoît
prokium
 
Messages: 12
Inscription: Mar 14 Juin 2016 07:46

Re: convert double/float to hexadecimal

Message non lude Laetitia » Mer 20 Juil 2016 14:26

Bonjour,

Je ne suis pas sûre de bien saisir le problème : pourquoi avez-vous besoin de convertir les nombres en hexadécimal ?

Si c'est pour un traitement ultérieur hors Actoboard, il faut connaître le format attendu par le destinataire des données : le "classique" virgule flottante, partie entière/partie décimale ou autre format plus exotique ? Dans le premier cas les données sont déjà envoyées au bon format, sinon il faudra adapter la conversion.

S'il s'agit juste d'envoyer les données sur le réseau Sigfox, il n'y a pas de conversion à faire ! Si vous utilisez la fonction Akeru.send(), les données envoyées (le payload) sont les octets contenant les données, envoyés en binaire, bruts. Ici la notion d'octet hexadécimal sert simplement à indiquer que :
  • le modem enverra des salves de 8 bits à la fois, jusqu'à épuisement des données. Le traitement est effectué à la réception par Actoboard, c'est pour cela que vous devez spécifier le format attendu des données (int, float, etc)
  • chaque salve représente 2 caractères hexadécimaux (2x 4 bits), rapide à coder si vous avez accès aux données brutes ou que vous voulez simplement faire un test (message reconnaissable du genre 0xCAFE pour vérifier l'état de la réception)
"If it's itchy, scratch it !" - "DIY or die"

RTFM (À lire avant de poster) - ANDb (Arduino Noob Database)
Avatar de l’utilisateur
Laetitia
 
Messages: 296
Inscription: Mar 7 Aoû 2012 15:07
Localisation: Toulouse

Re: convert double/float to hexadecimal

Message non lude Laetitia » Lun 25 Juil 2016 17:28

Bonjour,

Si vous avez besoin de convertir les données pour les envoyer via la commande Sigfox AT$SS, vous pouvez utiliser la routine suivante pour faire la conversion : on crée un pointeur sur un byte, et on l'initialise avec l'adresse du float. Comme un float est codé sur 32 bits, il suffit de lire les 4 premiers octets disponibles à l'adresse indiquée pour récupérer la valeur "brute" du float.

Code: Tout sélectionner
String floatToHexa(float f)
{
  byte * b = (byte*) & f;

  String bytes = "";
  for (int i=0; i<4; i++)
  {
    if (b[i] <= 0xF) // caractère unique
    {
      bytes.concat("0"); // ajout d'un "0"
    }
    bytes.concat(String(b[i], 16));
  }
  return bytes;
}

Comme la fonction retourne un String, il vous faudra utiliser la fonction String.c_str() pour avoir accès aux octets individuels. Voici un sketch permettant d'exploiter la routine ci-dessus, ainsi que l'accès aux octets individuels :

Code: Tout sélectionner
void setup()
{
  Serial.begin(9600);
}

void loop()
{
  float pi = 3.141592;
  String str = floatToHexa(pi);
  Serial.print("pi = 0x");
  Serial.println(str);

  for (int i=0; i<4; i++)
  {
    Serial.print("byte[");
    Serial.print(i);
    Serial.print("] = ");
    Serial.print(str.c_str()[2*i]);
    Serial.println(str.c_str()[2*i+1]);
  }
  while (1);
}

String floatToHexa(float f)
{
  byte * b = (byte*) & f;

  String bytes = "";
  for (int i=0; i<4; i++)
  {
    if (b[i] <= 0xF) // caractère unique
    {
      bytes.concat("0"); // ajout d'un "0"
    }
    bytes.concat(String(b[i], 16));
  }
  return bytes;
}
"If it's itchy, scratch it !" - "DIY or die"

RTFM (À lire avant de poster) - ANDb (Arduino Noob Database)
Avatar de l’utilisateur
Laetitia
 
Messages: 296
Inscription: Mar 7 Aoû 2012 15:07
Localisation: Toulouse

Re: convert double/float to hexadecimal

Message non lude prokium » Ven 29 Juil 2016 23:03

Bonjour,
Je n'ai pas eu le temps de me plonger a nouveau sur cette problématique depuis trop longtemps.

Le bout de code que vous m'avez fourni était se qui me manquait. Je ne trouvais pas comment convertir les valeurs en float.

Merci pour le support !

Benoit.
prokium
 
Messages: 12
Inscription: Mar 14 Juin 2016 07:46


Retourner vers Arduino

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité