Forum: Mikrocontroller und Digitale Elektronik String mit Zahl in exp-Schreibweise für LCD wandeln


von Der T. (Gast)


Lesenswert?

Hallo!

Ich bekomme von einem Messgerät per RS232 z.B. den String
"-1.25010000E-05" und muss diesen nun als 'lesbaren' Wert auf ein
Display bringen. Im obrigen Beispiel wäre dies z.B. "0.000", da die
Zahl (gemessene Spannung) vernachlässigbar klein ist.

Wie könnte ich sowas realisieren?

Meine Idee:
1. Stringende mit \0 kennzeichnen
2. String mittels strtol() in ein double verwandeln
3. Das double mittels sprintf in eine formatierte ASCII-Ausgabe
bringen
4. Wert ausgeben

Würde das funktionieren?
Wie müsste die sprintf-Bezeichner lauten?
Würde das ganze weniger Speicherintensiv auch gehen?

Bin für Tipps dankbar!

Gruß,
Techniker

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

strtol konvertiert in long integer.

Besser ist wohl strtod oder atof.

  printf("%.3f", wert);

gibt "wert" mit drei Nachkommastellen aus.

von Der T. (Gast)


Lesenswert?

Ich habe gerade folgendes ausprobiert:

double val;
unsigned char test[64];

val = 1.2552;
sprintf(test,"% .3f\r\n",val);

uart_puts(test);

Als Ergebnis erhalte ich am PC: '?<CR><NL>'

Was hat dieses Fragezeichen zu bedeuten? :-/

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das bedeutet, daß Du nicht mit der floating-point-printf-Library gelinkt
hast.

von Der T. (Gast)


Lesenswert?

:)

Klär mich bitte mal auf, wie ich das mache.. ;)
(hab avr-gcc 3.4.3)

von Sebastian Schildt (Gast)


Lesenswert?

http://www.nongnu.org/avr-libc/user-manual/group__avr__stdio.html#ga1

Im Standard WinAVR Makefile müsste das schon vorbereitet sein unter
Additional libraries. So einkommentieren sollte gehen:

# Floating point printf version (requires -lm below)
LDFLAGS += -Wl,-u,vfprintf -lprintf_flt

# -lm = math library HERE
LDFLAGS += -lm

von Hannes L. (hannes)


Lesenswert?

Wie wär's denn, wenn du anhand des Exponenten das Komma der Basis so
verschiebst, dass der Exponent durch 3 teilbar ist und die Basis >0 und
<1000 ist? Dann kannst du die Ziffernfolge der Basis ohne Rechnerei
übernehmen (mit verschobenem Dezimalkomma) und anhand des Exponenten
einen Einheiten-Vorsatz auswählen.

...

von Robert W. (rweber)


Lesenswert?

>> sprintf(test,"% .3f\r\n",val);

Das Leerzeichen im Format-String muss raus!

von Robert W. (rweber)


Lesenswert?

Sorry, vergiss mein Post. War Mist :-(

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.