Forum: Mikrocontroller und Digitale Elektronik [8051er] Double gleich Double von C#?


von Peter S. (Gast)


Lesenswert?

Hallo!

Ich benutze den 8051 F330 und Keil µVision3 (C). Der µC kommuniziert 
über die Serielle Schnittstelle mit einem PC, genauer gesagt mit einem 
C# Programm. Ich möchte nun zwischen µC und C# double Werte austauschen, 
doch irgendwie werde ich das gfühl nicht los, dass C# und µVisions C 
andere Formatierungen für double verwenden?

Beipsiel µC:
double test = 26;
char* test2;
char asugabe_buffer[8];
int i;

test2 = (char*)&test;
for(i=0;i<8;i++) ausgabe_buffer[i] = test2[i];
//ausgabe_buffer enthält der reihe nach von 0 beginnend:
//0x41 0xD0 0x00 0x00 0x00 0x00 0x00 0x00
//(= 65 208 0 0 0 0 0 0)

Beispiel C#:
double test_value = 26;
byte[] test_data2 = new byte[8];
test_data2 = BitConverter.GetBytes(test_value);
Console.WriteLine("{0} | {1} | {2} | {3} | {4} | {5} | {6} | {7}", 
test_data2[0], test_data2[1], test_data2[2], test_data2[3], 
test_data2[4], test_data2[5], test_data2[6], test_data2[7]);
//Ausgabe: 0 | 0 | 0 | 0 | 0 | 0 | 58 | 64

Stimmt irgend etwas mit meiner Umwandlung nicht oder werden hier 
unterschiedliche Formate verwendet?

Danke für eure Hilfe!

von (prx) A. K. (prx)


Lesenswert?

Peter S. schrieb:

> doch irgendwie werde ich das gfühl nicht los, dass C# und µVisions C
> andere Formatierungen für double verwenden?

Könnte man so sagen. Keil: "The double data type is identical to the 
float data type. Variables of type double are implemented using the same 
4-byte storage format as float types." Ist bei 8bit Mikros nicht 
ungewöhnlich. Kriegt man beispielsweise raus, indem man ein paar 
Sekunden in der Doku stöbert.

von Peter S. (Gast)


Lesenswert?

Ok dankeschön!

Gibts ne Möglichkeit, wie ich den Typ von Keil in den Typ von C# 
umrechne und umgekehrt?

von (prx) A. K. (prx)


Lesenswert?

Uralte Erfindung. Nennt sich American Standard Code for Information 
Interchange, kurz ASCII.

Mit etwas Glück sind aber die "float"s kompatibel. Mit oder ohne 
Bytevertauscherei.

von Peter S. (Gast)


Lesenswert?

Achso eigentlich heißt das ja, das double auch nur 4 Byte benutzt? Gibts 
denn keine Möglichkeit einen 8 Byte floating point Typ zu benutzen beim 
µC? Das währe äußerst wichtig, da die Werte sehr genau sein müssen...

von (prx) A. K. (prx)


Lesenswert?

Peter S. schrieb:

> Achso eigentlich heißt das ja, das double auch nur 4 Byte benutzt? Gibts
> denn keine Möglichkeit einen 8 Byte floating point Typ zu benutzen beim
> µC? Das währe äußerst wichtig, da die Werte sehr genau sein müssen...

Klar gibt es eine Möglichkeit. Funktionen für Fliesskommarechnung selber 
schreiben. Veilleicht gibt es auch Compiler mit 64bit double.

von Martin (Gast)


Lesenswert?

Auf der einen Seite mit sprintf ausgeben, übertragen und auf der anderen 
Seite mit sscanf einlesen - und umgekehrt. Gegebenenfalls eine eigene 
Routine schreiben.

von Mine Fields (Gast)


Lesenswert?

Oder noch einmal ganz genau darüber nachdenken, wie sinnvoll float oder 
gar double für die gewünschte Anwendung ist...

von Peter S. (Gast)


Lesenswert?

Stefan L. schrieb:
> Oder noch einmal ganz genau darüber nachdenken, wie sinnvoll float oder
> gar double für die gewünschte Anwendung ist...

Genau so hab ich es nun auch gemacht. Ich wandle den Gleitkommawert 
durch Multiplikation in einen Integerwert um und sende den, binär nicht 
ASCII kodiert da das unnötig viel Datenverkehr verursachen würde.

Danke für  eure Hilfe!

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.