Forum: Mikrocontroller und Digitale Elektronik Asci zu Float umwandeln


von Mark S. (mark522)


Angehängte Dateien:

Lesenswert?

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

von Jups (Gast)


Lesenswert?


von Mark S. (mark522)


Lesenswert?

das ist eine in Python, aber ich brauche die Lösung in C

von Jups (Gast)


Lesenswert?

also im Prinzip so:
1
import struct
2
Rx_data=b'\x01\x01\x33\x33\x5E\x42\x02\x02'  
3
print struct.unpack('<f', Rx_data[2:6])

von Jockel (Gast)


Lesenswert?

Mark S. schrieb:

> das ist eine in Python, aber ich brauche die Lösung in C

Stand ja auch in deinem Eingangsbeitrag.

von Jups (Gast)


Lesenswert?

ah. ok. dann schreib das doch.

von leo (Gast)


Lesenswert?

Mark S. schrieb:
> 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.

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

Du suchst also "single" float.

leo

von Jups (Gast)


Lesenswert?

in C geht das mit ner Union:
1
typedef union
2
{
3
  float f;
4
  uint32_t int32;
5
} float_4bytes;

von Jups (Gast)


Lesenswert?

bzw als Byte-Array:
1
typedef union
2
{
3
  float f;
4
  uint8_t b[4];
5
} float_4bytes;

einfach auf b[] schreiben und f lesen.

von Wolfgang (Gast)


Lesenswert?

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.

von Jups (Gast)


Lesenswert?

>das selbe 4-Byte Float Format
ist IEEE-754.

Bei
1
union
2
{
3
  float f;
4
  uint8_t b[4];
5
} b4_f;
6
7
float f;
8
9
b4_f.b[0]=0x33;
10
b4_f.b[1]=0x33;
11
b4_f.b[2]=0x5E;
12
b4_f.b[3]=0x42;
13
14
f = b4_f.f;

kommt f=55.5499992 raus.

von Wolfgang (Gast)


Lesenswert?

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.

von Christian M. (Gast)


Lesenswert?

Mark S. schrieb:
> Asci

oder

Mark S. schrieb:
> ASIC

Oder doch eher ASCII?

Gruss Chregu

von Mark S. (mark522)


Lesenswert?

Christian M. schrieb:
> Oder doch eher ASCII?

ASCII sorry

von Mark S. (mark522)


Angehängte Dateien:

Lesenswert?

ich bekomme error, nähmlich expected identifier or '('. was bedeutet das 
?

von Kochschlumpf (Gast)


Lesenswert?

Die Fehlermeldung sagt eigentlich glaskklar, was das Problem ist.

bf_4 ist ein Typname und keine Variable.

von Mark S. (mark522)


Lesenswert?

und wie kann ich das lösen ?

von Mark B. (markbrandis)


Lesenswert?

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.

von Kochschlumpf (Gast)


Lesenswert?

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.

von What (Gast)


Lesenswert?

Mark S. schrieb:

> und wie kann ich das lösen ?

Einfach Code vergleichen (siehe Code oben von Jups):
1
union
2
{
3
  float f;
4
  uint8_t b[4];
5
} b4_f;
6
7
float f;
8
9
b4_f.b[0]=0x33;
10
b4_f.b[1]=0x33;
11
b4_f.b[2]=0x5E;
12
b4_f.b[3]=0x42;
13
14
f = b4_f.f;

von Dirk B. (dirkb2)


Lesenswert?

Du brauchst einen Variable.
Ein Typ alleine reicht nicht.

von Dirk B. (dirkb2)


Lesenswert?

Mark S. schrieb:
> nähmlich

wer nämlich mit h schreibt ist d...

von Kochschlumpf (Gast)


Lesenswert?

Eine kleine, rethorische Frage, die vielleicht etwas weiter hilft:

Warum schreibst Du in einem Programm nicht
1
int = 7;
2
char = 'a';
3
float = 4.6;

von Kochschlumpf (Gast)


Lesenswert?

Ich bin dämlich. Ich schreibe "nämlich" nämlich immer mit 'h'. :-)

von Mark S. (mark522)


Lesenswert?

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

von Peter S. (psavr)


Lesenswert?

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?

von Mark B. (markbrandis)


Lesenswert?

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.

von Mark S. (mark522)


Lesenswert?

ok ich habe versucht einen Variable von Typ b4_f anzulegen, aber zeigt 
immer noch einen Error

von Kochschlumpf (Gast)


Lesenswert?

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
int a = 7;
2
char b = 'a';
3
float c = 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.

von Wolfgang (Gast)


Lesenswert?

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.

von What (Gast)


Angehängte Dateien:

Lesenswert?

Im Anhang ist der Screenshot nach der Abarbeitung des Codes von Jups.

Entweder ist Mark ein Troll oder ein Ignorant.

von Mario M. (thelonging)


Lesenswert?

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".

von Wolfgang (Gast)


Lesenswert?

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.

von Dirk B. (dirkb2)


Lesenswert?

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).

von MaWin (Gast)


Lesenswert?

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 anzulegen

What 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.

von Mark S. (mark522)


Angehängte Dateien:

Lesenswert?

nun habe ich bitte eine weitere Frage. Wieso übernimmt die Variable DC1 
nicht den f-Wert (44.900015)?
danke
1
/* USER CODE BEGIN 0 */
2
uint8_t Rx_data[8];
3
float f;
4
float pwm1;
5
float pwm2;
6
float DC1;
7
float DC2;
8
9
void park_sensor1(DC1){
10
  
11
if (Rx_data[6]==0x02 && Rx_data[7]==0x02){
12
  
13
     pwm1=(DC1/100.0);
14
   __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,pwm1);
15
}
16
}
17
18
19
void park_sensor2(DC2){
20
if (Rx_data[6]==0x03 && Rx_data[7]==0x03){
21
22
     pwm2=(DC2/100)*2584;
23
   __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,pwm2);
24
}    
25
}
26
void convert(void){  
27
28
  union
29
{
30
  float f;
31
  uint8_t b[4];
32
} b4_f;
33
34
b4_f.b[0]=Rx_data[2];
35
b4_f.b[1]=Rx_data[3];
36
b4_f.b[2]=Rx_data[4];
37
b4_f.b[3]=Rx_data[5];
38
39
f = b4_f.f;
40
return;
41
}
42
/* USER CODE END 0 */
1
  while (1)
2
  {
3
    /* USER CODE END WHILE */
4
5
    /* USER CODE BEGIN 3 */
6
7
    convert();
8
    park_sensor1(f);
9
  }
10
  /* USER CODE END 3 */
11
}

von What (Gast)


Lesenswert?

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ß.

von Mark S. (mark522)


Lesenswert?

das heißt ich kann diesen typ f nicht an die Funktion übermitteln oder 
wie ?

von Jups (Gast)


Lesenswert?

lass mal das:
1
float DC1;
2
float DC2;

weg und schreib bei den Funktionen ein float vor den Funktionsparameter. 
Also so:
1
void park_sensor1(DC1){

Und dann geh mal mit dem Debugger Schritt für Schritt durch.

von Jups (Gast)


Lesenswert?

Also so:
1
void park_sensor1(float DC1){

Beitrag #6017077 wurde von einem Moderator gelöscht.
von Mark S. (mark522)


Lesenswert?

Jups schrieb:
> void park_sensor1(float DC1){

danke dir

von Dirk B. (dirkb2)


Lesenswert?

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.

von Mark S. (mark522)


Lesenswert?

Dirk B. schrieb:
> Mit Versuch und Irrtum kommst du da nicht wreit.

sondern ?

von Dirk B. (dirkb2)


Lesenswert?

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.

von Jups (Gast)


Lesenswert?

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.

...

von Dirk B. (dirkb2)


Lesenswert?

Das mag am Alter von C (und dem der der Programmierer) liegen.
Zudem gibt es wohl keine guten Online-Tutorials für C.

von SchredderElch (Gast)


Lesenswert?

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 :-))

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.