Réception d'une String à convertir en byte ou int pour la suite du code

Bonjour,

j'ai un souci de code, dans mon projet, je reçois actuellement une trame sous forme :

ACTION=24:6F:28:38:D1:A4:ON

Donc :
Première partie pour déterminer le type de trame ici "ACTION"
Deuxième partie qui est l'adresse MAC de l'accessoire ici "24:6F:28:38:D1:A4"
Et enfin l'action que doit faire l'accessoire ici "ON"

Mon problème étant que j'utilise le protocole NOW de l'ESP32 pour communiquer avec mon accessoire et que le code pour rentrer l'adresse est le suivant :

uint8_t broadcastAddress[] = {0x24, 0x6F, 0x28, 0x38, 0xD1, 0xA4};
esp_err_t result2 = esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));

Dans l'exemple ci dessus j'ai rentré manuellement le code : {0x24, 0x6F, 0x28, 0x38, 0xD1, 0xA4}
Mais maintenant je voudrais rentrer le code automatiquement via celui réceptionné dans ma trame.

Alors j'ai déjà analysé ma trame et ressorti de celle-ci 6 variables string contant chacune un bloc de 2 chiffres, dans mon exemple ici :

Code1 = 26
Code2 = 6F
Code3 = 28
Code4 = 38
Code5 = D1
Code6 = A4

Jusque la rien de bien compliqué mais maintenant je ne voit pas comment l'envoyer dans le 'uint8_t broadcastAddress'. J'ai bien naïvement essayé de remplacé le 0x24 par 0xCode1 etc etc etc mais évidement que cela ne fonctionne pas ...

Auriez-vous une petite idée parce que je sèche je ne sais même pas dans quelle format et comment convertir mes String pour qu'ils soient pris en compte...

Merci pour votre aide

Flyer-74

Regarde du côté de strtol().

// si x est une C string
  char x[] = "24";
  byte c = strtol(x, 0, 16)
// si x est une String C++
  String x = "24";
  byte c = strtol(x.c_str(), 0, 16)

strtol() retourne un long mais si tu es sûr de ne convertir que des nombres entre 00 et ff cela ne pose pas de problème. Le cast est implicite.

Bonjour,

strtoul, avec ou sans strtok

Exemple ici 8OV1vL - Online C++ Compiler & Debugging Tool - Ideone.com

Excellent !!! Cela fonctionne super bien ! Merci beaucoup voilà 3j que je m’arrache les cheveux :slight_smile:

Puisqu'on est en C++ et qu'on utilise des objets String, ne réinventons pas la roue !!
La classe String possède des méthodes pour "se" convertir en un int (toInt), un float (toFloat), etc...
Voir la doc, en bas de la page

Je ne pense pas que toInt() puisse convertir une chaîne hexadécimale.

Alors j’ai déjà analysé ma trame et ressorti de celle-ci 6 variables string contant chacune un bloc de 2 chiffres, dans mon exemple ici :

Il est à noter que le demandeur parle de string, sans préciser : String ou Cstring ?
Si la cible est un ARDUINO je ne donne pas cher de la longévité du programme s’il s’agit de String …

Il est aussi possible d'utiliser sscanf, ça peut simplifier beaucoup de choses

hbachetti:
Il est à noter que le demandeur parle de string, sans préciser : String ou Cstring ?
Si la cible est un ARDUINO je ne donne pas cher de la longévité du programme s'il s'agit de String ...

Pourquoi cela ?

As-tu déjà entendu parler de fragmentation memoire ?