convertir un tableau de byte (adresse mac) en tableau de char (pour affichage)

Bonsoir,

Je suis toujours sur mon projet de datalogger et je suis confronté à un autre problème.

L'adresse mac de mon Ethernet shield est stockée sous la forme d'un tableau de byte {0x90, 0xA2, 0xDA, 0x80, 0x0A, 0x4C} et je souhaite réaliser une fonction me permettant de retourner cette adresse mac sous la forme d'un tableau de char "90:A2:DA:80:0A:4C"

J'ai bien trouvé différente méthode pour créer mon tableau de char mais mon problème se situe lorsqu'il s'agit de retourner ce tableau en fin de fonction.

voici ma fonction :

byte mac[]  = { 0x90, 0xA2, 0xDA, 0x80, 0x0A, 0x4C};

void setup() {
  Serial.begin(115200);
  Serial.print("[");
  Serial.print(macAddressToString());
  Serial.println("]");
}

void loop() {
}

char* macAddressToString() {
  char ma[18];
  
  for(byte i = 0; i < 6; i++) {
    ma[3*i] = (mac[i] >> 4) + 0x30;
    if(ma[3*i] > 0x39) ma[3*i] += 7;
    ma[3*i+1] = (mac[i] & 0x0f) + 0x30;
    if(ma[3*i+1] > 0x39) ma[3*i+1] += 7;
  }
  
  ma[2] = ':';
  ma[5] = ':';
  ma[8] = ':';
  ma[11] = ':';
  ma[14] = ':';
  ma[17] = '\0';

  Serial.print("[");
  Serial.print(ma);
  Serial.println("]");

  return ma;
}

Lorsque j'exécute le code ci-dessous, voici ce que j'obtiens sur le port série :

[[90:A2:DA:80:0A:4C]
90:A     ]

Après le 90:A, j'ai toute une série de caractères non affichables.

A mon avis tu devrais profiter de l'occasion pour essayer de comprendre plus avant les notions de C qui te font défaut.
:stuck_out_tongue:

Le plus gros problème de ton code réside dans la gestion de l'allocation de mémoire pour une chaîne de caractère.
Ton "char ma[18]" n'est alloué qu'à l'intérieur de ta fonction macAddressToString.

à moindre modif de code, je pense que tu peux le remplacer par "static char ma[18]" mais s'il te plait documente toi et essaye de trouver par toi-même pourquoi cela résout le pb. Ce sera plus instructif.

Pour le reste l'intérieur de ta fonction macAddressToString me semble compliqué mais fonctionne (la boucle for et ce qui suit).

Supprime les 3 Serial.print à l'intérieur de ta fonction, qui font doublon avec ceux de la fonction setup()

NB : si c'est juste pour afficher l'adresse MAC sur le port série, un
Serial.print(mac[i],HEX) fait l'affaire.

sprintf() est plutôt sympa pour convertir des nombres en chaine de caractères.

exemple :

sprintf(chaine,"%i:%i:%i:%i",nombre[0),nombre[1],nombre[2],nombre[3]);

Serial.println("%s",chaine);

Et voila.

oui, mais il me semblait plus didactif de commencer par mieux appréhender l'allocation mémoire associée aux variables.

Avant de savoir courir il faut savoir marcher :wink:

@bigben99 : ce que tu cherches à faire dans ta fonction macAddressToString devrait effectivement pouvoir tenir en une ligne :

sprintf(ma,"%02x:%02x:%02x:%02x:%02x:%02x",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);

Mais là encore je te conseille de chercher pour bien assimiler le principe de cette instruction, et pas simplement de l'utiliser telle quelle.

Bonjour,

Le mieux pour savoir ce que fait une fonction c'est d'aller directement lire la doc :grin:
sprintf() -> http://www.cplusplus.com/reference/cstdio/sprintf/
Et les différents types de %machin -> http://www.cplusplus.com/reference/cstdio/printf/