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
Stell mal die vier Bytes in ihrer Reihenfolge um und sieh Dir dann nochmal die IEEE754 an.
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.
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.
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.