Zeichen der float-Variable iin char wandeln?

Gast #3137209
Lesenswert?

Hallo Gemeinde,
trotz suche in diesem Forum und mit Hilfe einer bekannten Suchmaschine 
konnte ich keine Lösung finden. Sollte ich diese jedoch übersehen haben 
verweist mich hin und gebt mir einen mit dem Zaunpfahl. Aber nicht so 
fest, bin Mädchen. ^^
Folgendes Problem beschäftigt mich:
Eine Fließkommazahl soll mittels UART an einen PC übergeben werden, 
beispielsweise 125,62. Mein Programm tut auch das, was ich programmiert 
habe, aber nicht das, was ich will.
Hier der (gekürzte) Code:
1
void Ausgeben(char data)
2
{
3
  UCSRB |= (1<<3);
4
  while (!(UCSRA & (1<<UDRE))); // warten bis Puffer bereit
5
  UDR=data;
6
  _delay_ms(10);
7
  UCSRB &= ~(1<<3);
8
}
9

10
void schreibe_uart(char *str)
11
{
12
  while (*str)
13
  {
14
    Ausgeben(*str); str++;
15
  }
16
}
17

18
// Im Hauptprogramm finden sich folgende Zeilen:
19
 float zahl = 125,62;
20
sprintf(buffer,"%f",zahl);
21
schreibe_uart(buffer);

Als Ausgabe erhalte ich ein ? auf dem Bildschirm.
Kann ich  irgendwie die einzelnen Zahlenkomponenten als Char übergeben, 
sprich jedes Zeichen inklusive Punkt einzeln in UDR einlesen und 
übermitteln?

Vielen Dank im Voraus für eure Hilfe oder den Zaunpfahl.

Micha
Gast #3137263
Lesenswert?

Ja, die serielle Übertragung funktioniert.

Und es funktioniert. Karl Heinz Buchegger hat den richtigen Tipp 
gegeben.Ein wirklich riesiges Dankeschön!!!!
Aber auch euch anderen, die ihr euch mit meinem Problem befasst habt, 
ein riesen Dankeschön!
Gast #3138701
Lesenswert?

Hi,

ist printf mit float nicht sehr langsam? Ich habe immer gute Erfahrungen 
mit "union" gemacht. Das dürfte schneller sein.

Pseudo-Code
1
float zahl = 120.5;
2
char _array[4];
3

4
union float_array{
5
float z;
6
char arr[4];
7
}
8

9
float_array.z = zahl;
10

11
uart_send(float_array.arr[0]);
12
uart_send(float_array.arr[1]);
13
uart_send(float_array.arr[2]);
14
uart_send(float_array.arr[3]);

Mit dem char Array "arr" greifst du auf die einzelnen Bytes des Floats 
zu. Wenn du char's empfängst machst man das ganze andersherum.

MfG
GamerBoy
(Firma: Basta) #3138704
Lesenswert?

Schlecht ausgedrückt, und unabhängig von Unions, ist der grundsätzliche 
Einwand von Gameboy gerechtfertigt.

sprintf("%f") aus dem Mikrocontroller benötigt Zeit, der PC kann das 
schon schneller umwandeln.

P.S.: Um die Bytes einer Float-Variable zu übertragen braucht man 
lediglich deren Adresse.
#3138786
Lesenswert?

GamerBoy schrieb:
> Hi,
>
> ist printf mit float nicht sehr langsam?

vergleichsweise: ja

Das ist aber nicht die entscheidende Frage.
Die entscheidende Frage ist: ist es zuuuuu langsam?

Habe ich alle Zeit der Welt, dann spielt es keine Rolle.
Hat dafür aber den Vorteil, dass ich am PC kein Spezialprogramm brauche, 
sondern die Ausgabe auf jedem Terminal machen kann.
Von Protokollproblemen mal komplett abgesehen, die bei Textübertragung 
trivial zu lösen sind.
Gast #3139567
Lesenswert?

Also für mein kleines Programm ist die Zeit noch nebensächlich. Aber 
trotzdem behalte ich union mal im Auge. Denn so nach und nach arbeite 
ich mich an resourcenschondende Programmierung heran.

Grüße
Micha

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