www.mikrocontroller.net

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


Autor: Der Techniker (_techniker_)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
strtol konvertiert in long integer.

Besser ist wohl strtod oder atof.

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

gibt "wert" mit drei Nachkommastellen aus.

Autor: Der Techniker (_techniker_)
Datum:

Bewertung
0 lesenswert
nicht 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? :-/

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: Der Techniker (_techniker_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
:)

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

Autor: Sebastian Schildt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.nongnu.org/avr-libc/user-manual/group__...

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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Robert Weber (rweber)
Datum:

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

Das Leerzeichen im Format-String muss raus!

Autor: Robert Weber (rweber)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, vergiss mein Post. War Mist :-(

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.