Forum: PC-Programmierung Zahlenkonvertierung vom µC -> PC


von MT (Gast)


Lesenswert?

Hallo,

ich würde gerne ein paar Messwerte von einem µC Regelgerät mit einem 
VB.NET/C# Programm darstellen. Das Gerät sendet mir über eine serielle 
Schnittstelle die Zahlen, als Gleitkomma mit 4 Byte.
Nun versuche ich die Codierung der Zahl herauszufinden.

Hier mal ein paar Beispiele:

Bytes 0 - 3    Zahlenwert
00 00 00 00    0,0000
00 00 00 81    1,0000
00 00 00 82    2,0000
00 00 40 82    3,0000
00 00 00 83    4,0000
00 00 20 83    5,0000
00 00 40 83    6,0000
00 00 60 83    7,0000
00 00 00 84    8,0000
00 00 00 85    16,000
00 00 00 86    32,000
00 00 00 87    64,000

00 00 80 81    -1,000
00 00 80 82    -2,000
00 00 C0 82    -3,000
00 00 80 83    -4,000
00 00 A0 83    -5,000
00 00 C0 83    -6,000
00 00 E0 83    -7,000
00 00 80 84    -8,000

00 00 00 80    0,5000
00 00 00 7F    0,2500
00 00 00 7E    0,1250
00 00 00 7D    0,0625
00 00 00 7C    0,03125

00 00 20 81    1,2500
00 00 40 81    1,5000
00 00 60 81    1,7500

00 00 A0 81    -1,2500
00 00 C0 81    -1,5000
00 00 E0 81    -1,7500

Kennt einer von Euch zufällig das Format, oder kann mir dabei helfen, 
diese Bytes lesbar zu machen?

Ich komme mit meinen Kentnissen über Gleitkommazahlen und der IEEE 754 
irgendwie nicht auf die korrekt dargestellte Zahl.

Der µC-Typ ist mir nicht bekannt, ich möchte das Gehäuse nicht 
zerstören. Es scheint aber ein größerer zu sein, da er sich per Daten- 
und Adressbus erweitern lässt.

Grüße
Michael

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Stell mal die vier Bytes in ihrer Reihenfolge um und sieh Dir dann 
nochmal die IEEE754 an.

von yalu (Gast)


Lesenswert?

Das Format ist folgendes:
1
Bit 31                                 0
2
     |                                 |
3
     EEEEEEEE VMMMMMMM MMMMMMMM MMMMMMMM

E ist der 8-Bit-Exponent, V das Vorzeichen (1 für negative Zahlen) und M
die 23-Bit-Mantisse. Folgende C-Routine wandelt die Binärdarstellung in
ein C-Double um:
1
double b2d(unsigned int b) {
2
  double d = 0.0;
3
4
  if(b)
5
    d = ldexp((double)(b&0x7fffff|0x800000), (int)(b>>24)-152);
6
  if(b & 0x800000)
7
    d = -d;
8
  return d;
9
}

Dabei sind denormalisierte Zahlen, Unendlich und ungültige Zahlen (NaN),
wie sie IEEE-754 vorsieht, nicht berücksichtigt, da ich nicht weiß, ob
und wie dein Mikrocontroller diese unterstützt.

von MT (Gast)


Lesenswert?

Dank yalu!
Nach sowas bin ich suche ich ganze Zeit.
Dann werde ich jetzt mal versuchen das ganze zu verstehen...

Das mit den denormalisierten und ungültigen Zahlen kann ich nicht sagen, 
da ich den Regler nur dazu kriege Messwerte und Einstellungen zu senden.

von yalu (Gast)


Lesenswert?

> Das mit den denormalisierten und ungültigen Zahlen kann ich nicht sagen,
> da ich den Regler nur dazu kriege Messwerte und Einstellungen zu senden.

Da die Messwerte und Einstellungen sicher ganz "gewöhnliche" Zahlen
sind, die nicht in der Nähe der Grenzen des Zahlenformats liegen,
brauchst du diese Sonderfälle wahrscheinlich nicht zu berücksichtigen.

Die Sonderfälle treten bspw. dann ein, wenn eine Zahl betragsmäßig
kleiner als etwa 1.4E-39 ist oder die Software auf dem Mikrocontroller
fehlerhafterweise durch Null dividiert oder die Wurzel aus einer
negativen Zahl zieht. Aber das wird ja hoffentlich nicht passieren.

> Dann werde ich jetzt mal versuchen das ganze zu verstehen...

Auch wenn die IEEE-754-Formate etwas anders aufgebaut sind, lohnt es
sich zum Verständnis trotzdem, etwas darüber zu lesen:

  http://de.wikipedia.org/wiki/IEEE_754

Die Unterschiede liegen im Wesentlichen in den Bitgrößen von Mantisse
und Exponent, den Bitpositionen und dem Bias. Die Grundidee, die Zahlen
als Produkt aus Mantisse und Zweierpotenz darzustellen, ist aber bei
beiden die gleiche.

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.