Forum: Mikrocontroller und Digitale Elektronik double in bytes konvertieren/wiedergeben


von Hugo Paul (Gast)


Lesenswert?

Guten Morgen,
im Arduino bestimme ich die Zykluszeit und erhalte einen Wert in einer 
float-Variablen (32 bit). Diese Variable möchte ich nun über den CAN-Bus 
versenden, und muss dazu die Variable in 4 bytes aufteilen. Ich denke, 
dass das mit bitshift oder dem &-Operator (UND mit 0xff) geht. Liege ich 
da richtig, oder wie macht man sowas?
Grüße!

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Nein, du kannst einen float nicht shiften.

Nimm memcpy, das wird sogar vom Compiler optimiert.

von Peter II (Gast)


Lesenswert?

Hugo Paul schrieb:
> Liege ich
> da richtig, oder wie macht man sowas?

nein, denn shift geht nur für int.

ich würde es mit memcpy machen.

uint8_t b[sizeof(float)];
float f;

memcpy( b, &f, sizeof( float ) );

von chris (Gast)


Lesenswert?

float foo;

foo in ein array von Byte:
((unsigned char*)&foo)[0..3]

foo als unsigned long um z.B. shift sowie binary and zu realisieren
(*(unsigned long*)&foo)

von ... (Gast)


Lesenswert?

Dafür gibt es die union!

von Peter II (Gast)


Lesenswert?

... schrieb:
> Dafür gibt es die union!

nein gibt es nicht. sie gehen eventuell dafür, sind aber nicht dafür 
gemacht.

von Christian (Gast)


Lesenswert?

Ich würde es die Zeit je nach Genauigkeit mit 10, 100 oder 1000 
multiplizieren und dann in ein uint16 casten. Dafür muss der Faktor für 
die Genauigkeit in den anderen Geräten bekannt sein, wenn diese damit 
was anfangen wollen.

Beispiel: Die Zeit beträgt 3,452 Sekunden, multiplizier mit 100 ergibt 
345,2 und mit einem Cast kommst du dann auf 345.

So mache ich das überall, da ich mit einem µC ungern mit Float/Double 
rechne.

von Aeh (Gast)


Lesenswert?

Noch einfacher ist gleich den gemessenen Integer Wert zu senden, und die 
Umrechnung auf dem PC zu 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.