Pages: [1]   Go Down
Author Topic: convertir un tableau de byte (adresse mac) en tableau de char (pour affichage)  (Read 804 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 40
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 :
Code:
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 :
Code:
[[90:A2:DA:80:0A:4C]
90:A     ]

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

Offline Offline
Full Member
***
Karma: 4
Posts: 158
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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
Code:
Serial.print(mac[i],HEX)
fait l'affaire.
« Last Edit: July 11, 2013, 05:34:39 pm by bricoleau » Logged

Orleans
Offline Offline
Jr. Member
**
Karma: 1
Posts: 88
Macbidouilleur
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


exemple :
Code:

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

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


Et voila.
Logged


Offline Offline
Full Member
***
Karma: 4
Posts: 158
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-wink

@bigben99 : ce que tu cherches à faire dans ta fonction macAddressToString devrait effectivement pouvoir tenir en une ligne :
Code:
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.
Logged

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

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

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Pages: [1]   Go Up
Jump to: