Hi, ich habe folgende struct erstellt um übersichtlicher auf die Daten zugreifen zu können. typedef struct ST_MY_STRUCT { uint8_t op; uint16_t sec; uint32_t id; uint16_t flags; char addr[6]; char name[16]; char fin[12]; } MY_STRUCT; Weiter habe ich einen Buffer wo die Daten vom UART kommen... char buf_uart[128]; Um die nun im Struct- Zugriff Daten im "buf_uart" zu ändern gehe ich wie folgt vor ... MY_STRUCT* pMY_STRUCT = (MY_STRUCT*) buf_uart; pMY_STRUCT->id = 0xFF12AE34; pMY_STRUCT->op = 15; pMY_STRUCT->sec = 600; Die Daten stehen dann an der Position wo sie hingehören im RAM... Nur zurück habe ich nun das Problem das die Inhalte nicht stimmen... :-( uint32 id_read; MY_STRUCT* pREAD_MY_STRUCT = (MY_STRUCT*) buf_uart; id_read = pREAD_MY_STRUCT->id; Inhalt von id_read ist anderes... Hoffe man kann es nachvollziehen und es gibt jemanden der Ahnung hat und mir einen Tip geben kann. ;-) Grüße, AVRli...
Ich habe id_read (welches übrigens falsch deklariert war, bei Dir steht uint32 anstatt uint32_t) mal einen Initialwert gegeben:
1 | #include <stdint.h> |
2 | #include <stdio.h> |
3 | |
4 | typedef struct ST_MY_STRUCT |
5 | {
|
6 | uint8_t op; |
7 | uint16_t sec; |
8 | uint32_t id; |
9 | uint16_t flags; |
10 | char addr[6]; |
11 | char name[16]; |
12 | char fin[12]; |
13 | } MY_STRUCT; |
14 | |
15 | char buf_uart[128]; |
16 | |
17 | void buffer_write(void) |
18 | {
|
19 | MY_STRUCT* pMY_STRUCT = (MY_STRUCT*) buf_uart; |
20 | pMY_STRUCT->id = 0xFF12AE34; |
21 | pMY_STRUCT->op = 15; |
22 | pMY_STRUCT->sec = 600; |
23 | }
|
24 | |
25 | void buffer_read(void) |
26 | {
|
27 | uint32_t id_read = 0; |
28 | printf("id_read Initialwert: %x\n", id_read); |
29 | |
30 | MY_STRUCT* pREAD_MY_STRUCT = (MY_STRUCT*) buf_uart; |
31 | id_read = pREAD_MY_STRUCT->id; |
32 | |
33 | printf("id_read nach Zugriff auf Struktur ueber Zeiger: %x\n", id_read); |
34 | }
|
35 | |
36 | int main() |
37 | {
|
38 | buffer_write(); |
39 | buffer_read(); |
40 | |
41 | return 0; |
42 | }
|
Die Ausgabe sieht so aus: id_read Initialwert: 0 id_read nach Zugriff auf Struktur ueber Zeiger: ff12ae34 Ob das gut ist, sich Zeiger auf einen Puffer so "zurechtzubiegen", da kann man geteilter Meinung sein. Besser wären sauber geschriebene Funktionen für die Anwendungsfälle: "Daten aus dem Puffer in die Struktur übertragen" "Daten aus der Struktur in den Puffer übertragen" Sauber geschriebene Funktionen benötigen in der Regel eher selten Casts.
:
Bearbeitet durch User
Vielen Dank für die Hinweise! uint32_t muß es natürlich sein! Das mit den Get/Set Routinen ist natürlich sauberer, das werde ich übernehmen. Funktioniert nun wie ich es mir vorgestellt hatte. :-D Super! Grüße AVRli...
Falls am anderen Ende der UART kein AVR hängt: Deine Struct kann je nach Prozessor ein Alignment-Loch zwischen "op" und "sec" enthalten.
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.