String und Typedef Struct

Hallo..

über die serielle Schnittstelle lese ich Strings mit fester Struktur ein.

z.b.

String record = "IF000111A1"

ich möchte in der späteren Verarbeitung gerne über eine Struktur die Teil Elemente des Strings verarbeiten.

typedef struct ifrecord // Structure of returned "IF" Record
{
String ID[2];
String Frequency[6];
String Mode[1];
String Flag[1];
} CATRecord;

wie kann ich später den String mit seinen Elementen ansprechen ? z.B.

myMode = CATRecord.Mode ? etc..

Danke vorab

Gruß
K.

typedef ist überflüssig

Außerdem scheint du char Arrays mit String Objekten zu verwechseln. Du hast das Arrays aus Strings

DF4XX:
... String Flag[1]; ...

Das halte ich für einen grundsätzlichen Fehler. Ein Flag ist üblicherweise dazu da, eine ja/nein-Information festzuhalten. Dafür nimmt man keinen String, sondern eine Variable des Typs boolean.

Gruß

Gregor

Trifft eigentlich auch auf die anderen Daten zu wenn es nicht Buchstaben sind. Das sollte man alles nach dem Einlesen Parsen und dann wenn möglich als Integer abspeichern. z.B. eine Frequenz muss kein String sein

Hallo

danke für die "tollen" Antworten".. Haben Sie mir zur meiner Fragestellung weitergeholfen ? Definitiv NEIN.

und ob ein Feld nun Flag oder Zahnbürste heisst, erstmal unwichtig ob boolean oder String. Ebenso ob ich ein Feld Names Frequency in String oder int verarbeite oder nicht.. Der String Record kommt eben so von einer Seriellen Schnittstelle und was danach kommt ist eine andere Sache.

Ich möchte lediglich wissen, ob ich ein "remapping" mit einer typdef struct... über einen String legen kann und wie adressiere ich diese Struktur.

Wer hat eine weiterhelfende Antwort?

Danke nochmals
K.

Mein Halbwissen sagt Stichwort Union

Habs aber in der Praxis noch nie gemacht

typedef struct ifrecord   // Structure of returned "IF" Record
{
char ID[2];
char  Frequency[6];
byte  Mode[1];
bool  Flag[1];
 } CATRecord;

Bist du sicher, dass du wirklich String Objekte willst und keine char array? Das würde besser zu deinen erhaltenen Daten passen.

Die wichtigste Antwort hast Du bereits bekommen aber vollkommen ignoriert: Lerne die Klasse String und char-Arrays zu unterscheiden. Mit String geht das, was Du willst nicht wirklich.

Wenn Du die Antworten nicht verstehst, ist es kein Wunder, wenn sie Dir nicht hilfreich erscheinen.

Gruß Tommy

DF4XX:
danke für die "tollen" Antworten".. Haben Sie mir zur meiner Fragestellung weitergeholfen ? Definitiv NEIN.

Dann ist möglicherweise Deine Fragestellung nicht klar.

DF4XX:
und ob ein Feld nun Flag oder Zahnbürste heisst, erstmal unwichtig ob boolean oder String.

Bitte drücke Dich verständlich aus. Wie eine Variable heißt, ist tatsächlich wurscht. Der Typ allerdings nicht.

DF4XX:
Ebenso ob ich ein Feld Names Frequency in String oder int verarbeite oder nicht.

Nein. Welche Typen Du verwendest ist von elementarer Bedeutung.

DF4XX:
Der String Record kommt eben so von einer Seriellen Schnittstelle und was danach kommt ist eine andere Sache.

Auch das stimmt nicht. Eine serielle Schnittstelle liefert nicht per se einen String, sondern eine Folge von Bytes (oder Bits, um genau zu sein). Ob ein String oder ein Furz daraus wird, hängt davon ab, wie Du das handhabst.

DF4XX:
Wer hat eine weiterhelfende Antwort?

Ob eine Antwort hilft, hängt auch davon ab, ob Du die richtige Frage stellst.

Arbeite nicht mit String-Objekten, sondern mit char-Arrays. Zur Not kannst Du auch aus dem String-Objekt ein char-Array machen. In einem Array kannst Du jedes Zeichen (oder Element) einzeln ansprechen (und dann etwas Sinnvolles damit anstellen oder es in Biogas verwandeln).

Gruß

Gregor

Der Zugriff erfolgt mit StructName.Variable

Aber es ist sehr wohl relevant ob du da ein überflüssiges Array drin hast. Arrays kannst du nicht mit = zuweisen!

Ich versuche es nochmal..

Die Daten kommen via Serial-Port von einem Kurzwellen Transceiver.

Gelesen wird der einkommende Datenstrom wie folgt..

String CATRespString = "";
.
.
while (CATSerial.isListening() && (CATSerial.available() > 0))
{
char readChar = (char)CATSerial.read();
CATRespString += readChar;
}

Mag ja sein, das man die Daten auch in ein Char-Array einlesen kann, bin aber erstmal froh, das ich überhaupt Daten einlesen konnte.

So in vielen Arduino Beispielen publiziert.

Der eingelesen Daten String ist letztendlich 38 Bytes lang und sieht wie folgt aus.

"IF00003536802 000000000010000080;"

Das sind erstmal meine "Rohdaten" nach dem Einlesen.

Um es mir bei der weiteren Verarbeitung einfacher zu machen, wollte ich darüber eine symbolische Struktur legen, wie im ersten Post beispielhaft angegeben ist, damit ich nicht mit SubStrings mir einzelne Info's aus dem 38 Byte langen DatenRecord rauspicken muss.

Die Frage.. Geht das mit typedef struct ? wenn ja, wie ? - Wenn Nein, dann frickel ich eben mit SubStrings weiter.

Bin halt Anfänger in C Sprache.. :slight_smile:

Gruß

Das struct ist nicht das Problem. Natürlich kannst du Daten als struct organisieren. Typedef hast du aber anscheinend irgendwo gesehen ohne das verstehen.

Aber die Datentypen in dem struct sind falsch. Selbst wenn du umständliche String Objekte willst. Ein String ist etwas anderes als ein Array aus Strings

Bin halt Anfänger in C Sprache.

Das ist C++ und nicht C. Wenn du du dir irgendwelche C Sachen ansiehst, erklärt das auch woher das typedef kommt

DF4XX:
...
Um es mir bei der weiteren Verarbeitung einfacher zu machen, wollte ich darüber eine symbolische Struktur legen, wie im ersten Post beispielhaft angegeben ist, damit ich nicht mit SubStrings mir einzelne Info's aus dem 38 Byte langen DatenRecord rauspicken muss.

Die Frage.. Geht das mit typedef struct ? wenn ja, wie ? - Wenn Nein, dann frickel ich eben mit SubStrings weiter.
Bin halt Anfänger in C Sprache.. :slight_smile:

Dass Du Anfänger bist, ist nicht schlimm. Das tut nicht weh, oder?

Dass wir uns hier das Hirn verknoten, könntest Du damit belohnen, dass Du Dir die Arbeit machst, die Daten von Hand (bzw. zu Fuß) zu verarbeiten. Dann musst Du hier auch nicht ständig posten - mir kommt das vor wie jemand, der sich zehn Stunden erklären lässt, wie er sich zwei Stunden Weg sparen kann, anstatt endlich loszulatschen. Jemand, der sich dermaßen Arbeit mit Postings, Nachfragen, erneuten Postings, erneuten Nachfragen und erneut-erneut-erneut... macht in meinen Augen nicht den schlauesten Eindruck.

Frickle zwei Stunden. Dann hast Du's hinter Dir und kannst obendrein wahrscheinlich auch noch schneller tippen.

Und wenn dann alles so funktioniert, wie Du möchtest, bedankst Du Dich.

Gruß

Gregor