Daten in Struct versenden

Hallo ,

vermutlich bin ich völlig in der faschen Richtung unterwegs.

Bin derzeit dabei was neues zu lernen und Daten als Binärwerte versenden zu wollen, bisher hab ich das immer als Zeichenketten gemacht und die einzelnen Werte durch Semikolon getrennt. Vor einiger Zeit hab , glaube ich hier im Forum, etwas gesehen wo eine ganze Struktur als Block versendet worden ist. Das schien mir sehr logisch und einfach. Der gesamte Block wurde versendet und kam 1:1 so auch an. Bei gleicher Struktur auf beiden Seiten war der Zugriff so denkbar einfach.

Jetzt hab ich das heute mal versucht, dachte ist ja ganz einfach, klappt aber leider nicht. Es kann ja sein das in dem Beispiel an das ich mich da erinnere letzlich über Wlan gesendet wurde , also Client.write(), oder es war ein I2C Bus und das damit dann so geht. Versucht hab ich das jetzt aber erst mal mit der seriellen Schnittstelle mit einem UNO. Irgendwie muss das ja aber auch gehen, ohne das einzeln zu senden.

hab schon eine Weile rumgesucht , scheit mir aber alles zu kompliziert was ich da so gefunden hab. Irgendwie schwebt mir noch vor die Speicheradresse von mydaten herauszubekommen und dann ab da zu senden. Bei einem char Array geht es ja auch auf die Tour. Mir ist schon klar das auf dem Monitor so nur Mist ankommt.

Hat einer einen Tip

Danke schon mal.

struct daten {
  int zahl;
  float wert;
} ;
struct daten mydaten;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  mydaten.zahl = 1;
  mydaten.wert = 2.3;

  Serial.print("Grösse "); Serial.println(sizeof(mydaten));
  Serial.print("Daten "); Serial.print(mydaten.zahl);
  Serial.print("\t"); Serial.print(mydaten.wert);


  //so gehts nicht aber nicht
Serial.write(mydaten,sizeof(mydaten));


}

void loop() {
  // put your main code here, to run repeatedly:

}

Momentan reicht's zeitlich nur für:

struct daten {
  int zahl;
  float wert;
} ;
struct daten mydaten;

Da Du die Struktur bereits definiert hast (1. Zeile), darfst Du sie (s. letzte Zeile) nicht noch einmal definieren. Bereits hier sollte also der Compiler abbrechen und eine passende Meldung melden.

Gruß

Gregor

Strukturen und Klassen fangen gewöhnlich mit Großbuchstaben an. Ist aber kein Fehler

Irgendwie schwebt mir noch vor die Speicheradresse von mydaten herauszubekommen und dann ab da zu senden

Der "Adresse von" Operator ist &. Außerdem will write() einen Zeiger auf ein Byte. Dann braucht man noch einen Cast darauf

Also so:

Serial.write((byte*)&mydaten,sizeof(mydaten));

@gregorss

Da Du die Struktur bereits definiert hast (1. Zeile), darfst Du sie (s. letzte Zeile) nicht noch einmal definieren. Bereits hier sollte also der Compiler abbrechen und eine passende Meldung melden.

Das ist ja auch keine Neu-Definition. Da wird ein Objekt der Struktur erstellt. Das ist schon ok. Das "struct" muss man in C++ nicht extra hinschreiben, aber es schadet auch nichts

Serenifly:
Strukturen und Klassen fangen gewöhnlich mit Großbuchstaben an. Ist aber kein Fehler

Wobei das „Gewöhnlich“ manchmal auch „Java-Stil“ genannt wird. Ob Bezeichner für Strukturen u. dgl. mit einem Großbuchstaben beginnen oder nicht, ist eigentlich wurscht.

Serenifly:
Das ist ja auch keine Neu-Definition. Da wird ein Objekt der Struktur erstellt. Das ist schon ok. Das “struct” muss man in C++ nicht extra hinschreiben, aber es schadet auch nichts

Uh … was?! Eieiei, wieder was gelernt …

Hallo,

natürlich kannst du schreiben wie du möchtest, alles klein, alles groß, gemischt. Aber wenn das jemand anderes lesen soll der erwartet schon eine gewisse Form. Bspw. du schreibst grundsätzlich alles klein. Wie soll man dann mit einfachen Mitteln zwischen Konstanten, nicht konstanten Variablen, Klassen etc. unterscheiden können?

gregorss: Ob Bezeichner für Strukturen u. dgl. mit einem Großbuchstaben beginnen oder nicht, ist eigentlich wurscht.

Dann hast Du noch nicht in Softwareprojekten mit mehreren / vielen Mitarbeitern gearbeitet. Da werden die Schreibweisen konkret vorgegeben und wenn Du Dich nicht daran hälst, bist Du schneller wieder draußen, als Du rein gekommen bist.

Gruß Tommy

Tommy56: Dann hast Du noch nicht in Softwareprojekten mit mehreren / vielen Mitarbeitern gearbeitet. Da werden die Schreibweisen konkret vorgegeben und wenn Du Dich nicht daran hälst, bist Du schneller wieder draußen, als Du rein gekommen bist.

Naja, dass ansonsten gilt, was der Auftraggeber möchte, ist eh klar. Das mit den Großbuchstaben hat seinen Ursprung halt eher bei Java als bei C(++). Syntaktisch isses egal.

Gruß

Gregor

Doc_Arduino: Wie soll man dann mit einfachen Mitteln zwischen Konstanten, nicht konstanten Variablen, Klassen etc. unterscheiden können?

Ja nu ... indem man die syntaktischen Regeln kennt. Was bei

bool bool;

der Typ und was der Bezeichner ist, sollte jedem klar sein. Wenn's vielleicht auch ein arg blödes Beispiel ist.

Gruß

Gregor

Das Bsp. passt überhaupt nicht.

Hallo,

danke für die schnelle Rückmeldung , eigendlich hab ich das mit der Schreibweise von

C-HowTo

und

C++

@Serenifly das war´s danke.

Heinz

Wenn Du auf beiden Seiten bei einer Architektur bleibst, ist das gegessen. Wenn Du z.B. einen ESP8266 mit drin hast (32-Bit-Prozessor) musst Du etwas mehr aufpassen. Da habe ich hier und hier mal was geschrieben.

Gruß Tommy

Hallo,

@Tommy56 ohhh das ist aber böse. !!! Stimmt aber, ist eigendlich klar wenn man mal drüber nachdenkt. Jetzt geht es dann nur noch darum es,wenn man dann mal drüber stolper, wieder zu finden.

Heinz

Setz Dir einen Bookmark ;)

Gruß Tommy

Doc_Arduino: Das Bsp. passt überhaupt nicht.

Du verstehst hoffentlich trotzdem, was ich damit zeigen will. Es kann auch mit klein geschriebenen Typen nie auch nur der Hauch eines Zweifels aufkommen, was Typ und was Bezeichner ist.

Oder? ;-)

Gregor