Hallo zusammen,
ich habe eine nicht schlaue Frage, und zwar wie ich 4
Rx_data[2],Rx_data[3],Rx_data[4] und Rx_data[5] zusammenpacken kann und
dann diese zu float umwandeln. Die Daten werden über eine serielle via
Python gesendet. atof habe ich auch probiert. Die ASIC-Daten im Bild
sollten 55.55 entsprechen.
vielen Dank im Voraus
Mark S. schrieb:> wie ich 4 Rx_data[2],Rx_data[3],Rx_data[4] und Rx_data[5] zusammenpacken> kann und dann diese zu float umwandeln.
Wieso willst du da etwas umwandeln. Du musst die 4 Byte doch nur als
float interpretieren. Das funktioniert allerdings nur, wenn Absender-
und Empfängerrechner das selbe 4-Byte Float Format verwenden.
Jups schrieb:>>das selbe 4-Byte Float Format> ist IEEE-754.
Du wolltest sagen, die gesendeten Bytes sind IEEE-754, oder woher
kennst du die Erwartungshaltung des Empfängers?
Der Compiler des Empfängers muss der selben Meinung sein und die selbe
Endianness erwarten.
Mark S. schrieb:> und wie kann ich das lösen ?
Indem Du erstmal eine Variable vom Typ b4_f anlegst. Dann kannst Du die
Inhalte der angelegten Variablen beschreiben.
Ich schlage vor Du liest in Deinem C-Buch nochmal die Kapitel über
Variablen und deren Typen sowie über Typdefinitionen. Dann überlegst Du
Dir, was der Unterschied ist. Daraus müsste sich die Maßnahme eigentlich
selbst ergeben.
Offen gesagt, wenn Dir an dieser Stelle nicht wenigstens ungefähr klar
ist, was das Problem ist, dann ist Lektüre und üben, die beste Medizin.
Kochschlumpf schrieb:> Warum schreibst Du in einem Programm nicht
ok es gibt ja keine Variablen. Ich habe noch nie mit typen gearbeitet.
Deswegen habe ich nach Hilfe gefragt
Also ASCII{0x33,0x33,05e,042} ist aus meiner Sicht "33^B" waqs als Float
nicht wirklich Sinn macht?
Welchen Wert soll deine daraus resultierende Float haben?
Peter S. schrieb:> Also ASCII{0x33,0x33,05e,042} ist aus meiner Sicht "33^B" waqs als Float> nicht wirklich Sinn macht?>> Welchen Wert soll deine daraus resultierende Float haben?
Nein, die Umwandlung geschieht nicht so. Es werden die Bitmuster
interpretiert und diese ergeben nach IEEE 754 eine Gleitkommazahl.
Mark S. schrieb:> Kochschlumpf schrieb:>> Warum schreibst Du in einem Programm nicht>> ok es gibt ja keine Variablen. Ich habe noch nie mit typen gearbeitet.> [...]
Ich denke, Du übersiehst da Etwas, beziehungsweise Du übersiehst das Maß
der Bedeutung einer Sache, die Du an sich schon kennst. Du ziemlich
sicher schon geschrieben:
1
inta=7;
2
charb='a';
3
floatc=4.6;
Damit hast Du schon mit Typen gearbeitet. Oder?
Was Du im Moment vermutlich gerade wahrzunehmen beginnst ist, dass diese
"Namen" wie "a" für eine Variable und Typnamen wie "int" aber auch
selbstdefinierte Typen streng unterschieden werden müssen. Und zwar in
Hinsicht darauf, dass sie verschiedene Dinge meinen, nämlich "Variablen"
und "Typen" und das der tiefere Sinn dahinter einerseits mit der
"Definition" von Speicher als auch mit der Festlegung von Operationen zu
tun hat.
int und char sind z.B. in der Regel verschieden groß.
float und int erzeugen ganz verschiedene Operationen wenn Du etwa zwei
Float-Zahlen addierst oder zwei Int-Zahlen.
Deswegen muuss man genau darauf achten, was man mit einem Namen
eigentlich "bezeichnen" will (Dt. "Bezeichner" = En. "Identifier").
Es gibt - und das steht in einem C-Buch) Bezeichner für Typen (wie char
oder auch selbst beschriebene Typen) und Bezeichner von Variablen.
Peter S. schrieb:> Also ASCII{0x33,0x33,05e,042} ist aus meiner Sicht "33^B" waqs als Float> nicht wirklich Sinn macht?>> Welchen Wert soll deine daraus resultierende Float haben?Mark S. schrieb:> Die ASIC-Daten im Bild sollten 55.55 entsprechen.
Mark S. schrieb:> ich bekomme error, nähmlich expected identifier or '('. was bedeutet das> ?
Im gezeigten Codeschnipsel ist fälschlicherweise ein Semikolon hinter
"float f".
Mark S. schrieb:> ich bekomme error, nähmlich expected identifier or '('. was bedeutet das> ?
Dein Compiler ist ein C-Compiler. Bei den Fehlermeldungen musst du dir
angewöhnen, drei mal um die Ecke zu denken, bevor du beim eigentlichen
Problem an kommst.
Die Zeichenfolge "; =" versteht der einfach nicht und verrennt sich in
der Welt der Fehlinterpretationen.
Wolfgang schrieb:> Die Zeichenfolge "; =" versteht der einfach nicht und verrennt sich in> der Welt der Fehlinterpretationen.
Der gemeinte Fehler ist in Zeile 75 (der in Zeile 79 kommt noch dazu)
Der Compiler möchte nach der Zeichenkette b4_f entweder eine '(' (dann
wäre es eine Funktionsdeklaration/definition vom impliziten Typ int)
oder einen Identifier (dann wäre es eine Variablendefinition vom Typ
b4_t).
Au weia.
Mark S. schrieb:> 4 Rx_data[2],Rx_data[3],Rx_data[4] und Rx_data[5]> Asci
Das ist nicht ASCII, sondern das sind 4 bytes einer float Zahl im IEEE
754 Binärformat.
55.55 in ASCII wäre 0x35 0x35 0x2E 0x35 0x35
Mark S. schrieb:> Die Daten werden über eine serielle via Python gesendet.Mark S. schrieb:> aber ich brauche die Lösung in C
Schau an. Das wusstest du bei deiner Frage natürlich noch nicht.
Mark S. schrieb:> ok ich habe versucht einen Variable von Typ b4_f anzulegenWhat schrieb:> union> {> float f;> uint8_t b[4];> } b4_f;
Du hast einen Typ definiert, keine Variable angelegt.
What schrieb:> Entweder ist Mark ein Troll oder ein Ignorant.
Selten so jemanden erlebt, der so wenig Plan hat, Grundschüler.
MaWin schrieb:> What schrieb:>> union>> {>> float f;>> uint8_t b[4];>> } b4_f;>> Du hast einen Typ definiert, keine Variable angelegt.
Du bist nicht allein, hier stehen viele mit den einfachsten
C-Konstrukten auf Kriegsfuß.
Mark S. schrieb:> Jups schrieb:>> void park_sensor1(float DC1){>> danke dir
Also war es am Anfang nicht so, wie du in dem gelöschten Beitrag
schriebst.
Auch wenn es jetzt funktioniert ist es falsch (Schrott), da du zuviel
globale Variablen hast.
C ist eine Ziemlich einfache Sprache, das macht sie zwar nicht einfach
in der Benutzung, aber du hast schon bei den aller einfachsten Dinge
Probleme.
Mit Versuch und Irrtum kommst du da nicht wreit.
Mark S. schrieb:> Dirk B. schrieb:>> Mit Versuch und Irrtum kommst du da nicht wreit.>> sondern ?
Mit einem gescheiten Buch.
C lässt sehr viel Müll zu. Auch aus historischen Gründen.
Der Compiler erkennt das auch, gibt aber „nur“ Warnungen aus. Aber auch
nur, wenn man sie aktiviert.
Bei jeder C-Frage wird dem Fragesteller nahegelegt ein C-Buch zu lesen.
Bei keiner PHP-Frage wird dem Fragesteller nahegelegt ein PHP-Buch zu
lesen.
Bei keiner Löt-Frage wird dem Fragesteller nahegelegt ein Löt-Buch zu
lesen.
Bei keiner Java-Frage wird dem Fragesteller nahegelegt ein Java-Buch zu
lesen.
Bei keiner Mikrocontroller-Frage wird dem Fragesteller nahegelegt ein
Mikrocontroller-Buch zu lesen.
Bei keiner PWM-Frage wird dem Fragesteller nahegelegt ein PWM-Buch zu
lesen.
Bei keiner Arduino-Frage wird dem Fragesteller nahegelegt ein
Arduino-Buch zu lesen.
...
Moinsens ;-))
Dirk B. schrieb:> C lässt sehr viel Müll zu. Auch aus historischen Gründen.> Der Compiler erkennt das auch, gibt aber „nur“ Warnungen aus. Aber auch> nur, wenn man sie aktiviert.
ja irgendwie Witzig und zur Bestätigung schaut mal dort
----> http://pofahl.de/cwahrheit.htm <----
Bis dahin und einen schönen Abend :-))