Forum: Mikrocontroller und Digitale Elektronik Zeichen der float-Variable iin char wandeln?


von Micha (Gast)


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

von temp (Gast)


Lesenswert?

Micha schrieb:
> float zahl = 125,62;

> jedes Zeichen inklusive Punkt einzeln

ein Komma ist kein Punkt, zudem ist in C ein Komma ein Operator

von Peter II (Gast)


Lesenswert?

Micha schrieb:
> Als Ausgabe erhalte ich ein ? auf dem Bildschirm.

also dazu liefert die Suche bestimmt 10.000 Treffern. Du musst die float 
lib einbinden, dann klappt es auch mit dem printf.

von Karl H. (kbuchegg)


Lesenswert?

Micha schrieb:

> Als Ausgabe erhalte ich ein ? auf dem Bildschirm.

FAQ
Punkt 3: Aktivierung der ....

von Micha (Gast)


Lesenswert?

Mein schusseliger Fehler, Entschuldigung. Im Code steht 125.62

von amateur (Gast)


Lesenswert?

Geht die serielle Übertragung überhaupt, also unabhängig von der 
Fließkommaproblematik?

const char Irgendwas [] = "ABCDE";

Z.B.: schreibe_uart(Irgendwas);

von Micha (Gast)


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!

von GamerBoy (Gast)


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

von Kan a. (Firma: Basta) (kanasta)


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.

von Karl H. (kbuchegg)


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.

von Micha (Gast)


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

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.