String und Array ... irgendwo hakts

Hallo,

ich lese von meinem Arduino die IP und die MAC-Adresse aus und hätte beides gerne als String.

Bei der IP klappts schon ganz gut:

IPAddress myAddr = WiFi.localIP();
  ipaddress = String(myAddr[0])+ "." +String(myAddr[1]) + "." +String(myAddr[2]) + "." +String(myAddr[3]);

Bei der MAC-Adresse enthält mein String leider nur 16:16:16

  WiFi.macAddress(mac);

  macaddress = String((mac[5],HEX))+":"+String((mac[4],HEX))+":"+String((mac[3],HEX));

Ausgeben kann ich sie aber korrekt - da scheint was mit der Umwandlung von mac[4],HEX in String nicht zu funktionieren !?

// Print the IP address and MAC address
  Serial.print("My MAC is: ");

  Serial.print(mac[5],HEX);
  Serial.print(":");
  Serial.print(mac[4],HEX);
  Serial.print(":");
  Serial.print(mac[3],HEX);
  Serial.print(":");
  Serial.print(mac[2],HEX);
  Serial.print(":");
  Serial.print(mac[1],HEX);
  Serial.print(":");
  Serial.println(mac[0],HEX);

lG
Gawan

Schau dir snprintf() (eine Variante von printf()) an, wie man C Strings formatiert.

void setup()
{
  Serial.begin(9600);

  char buffer[20];
  byte ip[] = { 192, 168, 0, 1 };
  byte mac[] = { 0x01, 0x23, 0xc1, 0xf7, 0x89, 0xab };

  snprintf_P(buffer, sizeof(buffer), PSTR("%d.%d.%d.%d"), ip[0], ip[1], ip[2], ip[3]);
  Serial.println(buffer);

  snprintf_P(buffer, sizeof(buffer), PSTR("%02X:%02X:%02X:%02X:%02X:%02X"), mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
  Serial.println(buffer);
}

void loop()
{
}

Eine nette Alternative ist die PString Library:
http://arduiniana.org/libraries/pstring/
Damit kann man die Funktionen der Arduino Print Klasse auch mit normalen Puffern verwenden

Nachtrag:
Mal nachgesehen und theoretisch sollte das aber gehen. HEX ist als 16 definiert. Und die String Klasse hat bei den Konstruktoren einen optionalen Parameter für die Basis. Die doppelte Klammer ist aber überflüssig.

Ich glaube sogar dass die Klammern den Fehler verursachen. Da gibt es nämlich ein doofes "Feature" in C/C++. Wenn man Anweisungen einfach durch ein Komma trennt, wird die erste ausgeführt und die zweite zurückgegeben. Also wird die innere Klammer ausgeführt und es kommt 16 zurück und das wird an den Konstruktor übergeben.

Nachtrag 2:
Ja, das ist der Fehler. Und wenn du die Warnungen in der IDE aktiviert hättest, wäre dir auch gemeldet worden dass da was nicht stimmt:

warning: left operand of comma operator has no effect [-Wunused-value]

Weil mac[index] an sich nicht macht

Super, das funktioniert jetzt.
Jetzt hab ich aber das Problem dass die MAC-Adresse nicht stimmen kann.
An der Position 3 steht B :):slight_smile:

My MAC is: 63:68:b:7f:cf:5c
MAC: 63:68:B:7F:CF:5C

Idee ?

Ist doch identisch. Was soll statt dessen da stehen?

Das ist halt einstellig. Wenn du das immer zwei-stellig haben willst (mit führenden Nullen), dann verwende snprintf().
Oder mache jedesmal eine Abfrage ob die Ziffer < 0x10 ist und mache dann noch eine '0' davor.

Super, funktioniert jetzt sehr gut !!