String und Integer Variablen über I2C Senden

Hallo Gemeinde,

ich stehe derzeit vor einem Problem mit der Kommunikation zweier Arduino´s. Die Komunikation ist Standardmäßig mit der wire.h lib aufgebaut und funktioniert soweit auch. Nun möchte ich von meinem Master bei einem bestimmten zustand gewisse Variablen und die Aktuelle Uhrzeit die im Master von einer RTC abgefragt wird an den Slave senden.

Mein Problem besteht jetzt darin das die Kommunikation über die wire.h ja per byte funktioniert meine Daten die ich senden will aber vom typ integer oder char string sind.

Wie ist es möglich die Daten im Master zu verpacken und zu senden und sie im Slave wieder zu entpacken das ich sie wieder im gleichen Format wie im Master nutzen kann.

Ein Beispiel eines zu sendenden Pakets:
Stunde(int), Minute(int), Sekunde(int), Zustandsmeldung(string)

Wäre nett wenn ihr mir weiterhelfen könntet, ich habe die Suche schon benutzt aber irgendwie konnte ich nach mehreren Tagen suchen immer noch keinen Erfolg schreiben

Strings in C sind Arrays aus chars (characters). Die kannst du als Byte verschicken in dem du über die Länge des Strings iterierst. Char sind zwar signed und byte unsigned, aber das macht hier keinen Unterschied:

Das hier geht z.B. ohne Cast:

char c;
byte b = c;

Integer sind zwei Byte. Das kannst du einfach aufteilen: byte lsb = integer & 0xFF; byte msb = integer>>8 & 0xFF;

In der ersten Zeile wird einfach das höherwertige Byte aus-maskiert und dann bei der Typ-Verkleinerung von int auf byte abgeschnitten. In der zweiten Zeile schiebt man die Zahl erst mal um 8 Bit nach rechts und macht dann das gleiche.

Anders herum sollte das dann mit Links-Shift und verodern gehen.

EDIT: Auf dem Arduino gibt es dafür auch diese drei Funktionen: http://arduino.cc/en/Reference/LowByte http://arduino.cc/en/Reference/HighByte http://arduino.cc/en/Reference/WordCast

Die Variablen Stunde, Minute, Sekunde, müssen keine INT sein, es genügen Byte. Darum mußt Du die Werte nicht umformen. Grüße Uwe

Mhh, stimmt :)

Und muss die Zustandsmeldung unbedingt ein String sein? Könntest du da nicht vielleicht Codes definieren und dann 0, 1, 2, etc. verschiedenen Zuständen zuweisen? Dann kannst du im Slave ein String Array definieren und hast direkt die Ausgabe. Aber du musst nicht unbedingt einen ganzen String schicken.