Asci zu Float umwandeln

OP #6016215
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
Angehängte Dateien:
Gast #6016284
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.
Gast #6016317
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.
Gast #6016431
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.
Gast #6016780
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.
Gast #6016814
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.
Gast #6016826
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.
#6016855
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).
Gast #6016968
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.
OP #6017038
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
}
Angehängte Dateien:
Gast #6017067
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.
Beitrag #6017077 wurde von einem Moderator gelöscht.
#6017130
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.
Gast #6017369
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.

...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren