Forum: Mikrocontroller und Digitale Elektronik c char array in uint16_t speichern


von Simon (Gast)


Lesenswert?

Hallo,
ich habe folgendes Problem und würde mich über eine elegante Lösung 
freuen.

Es gibt einen String als char Array. Dieses soll mittels Modbus 
übertragen werden und zwar so, dass zwei Zeichen pro Wort(16 bit 
Register) auslesbar sein sollen. Nun könnte ich das alles per Cast auf 
uint16_t lösen da hätte ich aber das Probllem mit ungeraden 
Array-Größen.
Gibt es eine Möglichkeit char Arrays immer geradzahlig anzulegen?
Oder muss ich die Daten byteweise bearbeiten?
Oder gibt es noch eine bessere Lösung?
Das ganze läuft auf einem Mikrocontroller (SAMC20) Es ist zwar Speicher 
da; aber ich würde es gerne so kompakt wie möglch lösen.

Vielen Dank,
Simon

von Peter D. (peda)


Lesenswert?

Wie kommst Du auf 16 Bit?
Modbus überträgt über die UART, d.h. byteweise. Für Strings benutzt man 
ASCII-Modbus.

von Simon (Gast)


Lesenswert?

Hallo,
es wird die Funktion "03 (0x03) Read Holding Registers" genutzt.

"This function code is used to read the contents of a contiguous block 
of holding registers in a remote  device.  The  Request  PDU  specifies 
the  starting  register  address  and  the  number  of registers. In the 
PDU Registers are addressed starting at zero. Therefore registers 
numbered
1-16 are addressed as 0-15.
The  register  data  in  the  response  message  are  packed  as  two 
bytes  per  register,  with  the binary  contents  right  justified 
within  each  byte.  For  each  register,  the  first  byte  contains 
the high order bits and the second contains the low order bits.

von Dirk B. (dirkb2)


Lesenswert?

Simon schrieb:
> Gibt es eine Möglichkeit char Arrays immer geradzahlig anzulegen?

Was hindert dich daran, dem Array die Größe mitzugeben?
Oder meinst du Stringlitrale?

> Oder muss ich die Daten byteweise bearbeiten?

Wie du die Daten letztendlich behandelst ist egal.

von Simon (Gast)


Lesenswert?

Dirk B. schrieb:
> Was hindert dich daran, dem Array die Größe mitzugeben?
so mache ich es auch aktuell.

Ich hatte nur gehofft, dass man das eleganter lösen könnte. Das eine 
Byte um immer eine gerade Anzahl von chars zu haben würde mich nicht 
stören.
Ich überlege, ob ich ein union aus char und uint16_t dafür anlege. Damit 
müsste es ja immer passen, oder?

von Dirk B. (dirkb2)


Lesenswert?

Simon schrieb:
> Ich überlege, ob ich ein union aus char und uint16_t dafür anlege. Damit
> müsste es ja immer passen, oder?

Besser 2 char.
Was versprichst du dir davon?

Du kannst die Standardfunktionen nicht ohne cast benutzen (zumindest 
nicht ohne Warnung)
Eine Initialisierung mit einem Stringliteral geht auch nicht.
Und das wäre die einzige Erleichterung, weil du die Größe nicht angeben 
musst.

Pass die Übertragungsfunktionen an. Bei ungerader Stringlänge noch ein 
'\0' senden.

von Simon (Gast)


Lesenswert?

Dirk B. schrieb:
> Pass die Übertragungsfunktionen an. Bei ungerader Stringlänge noch ein
> '\0' senden.

Danke!
So werde ich es machen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.