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.
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.