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
Wie kommst Du auf 16 Bit? Modbus überträgt über die UART, d.h. byteweise. Für Strings benutzt man ASCII-Modbus.
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.
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.
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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.