Arduino: printf/fprintf druckt Fragezeichen anstelle von float
Habe ich folgenden code für ein Arduino-sketch:
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
static FILE lcdout = {0} ;
static int lcd_putchar(char ch, FILE* stream)
{
lcd.write(ch) ;
return (0) ;
}
void setup() {
lcd.begin(16, 2);
fdev_setup_stream (&lcdout, lcd_putchar, NULL, _FDEV_SETUP_WRITE);
}
void loop()
{
stdout = &lcdout;
printf("%.2f Volts", 2.0);
}
Das problem kommt in der letzten Zeile des Codes. Diese sollten ausgedruckt "2.00 Volt", sondern es gibt "? Volt" (ein Fragezeichen anstelle des eigentlichen float Wert). Wenn ich versuche, ein integer-format, das funktioniert Super.
Also im Grunde, wenn ich ersetzen Sie die printf-Zeile mit den folgenden, wird es richtig funktioniert:
printf("%d Volts", 2); //prints correctly "2 Volts"
Irgendeine Idee, was das problem ist ?
- Eine vereinfachte-down-stdlib, die nicht mit floating-point-conversions?
- Genau.
- Was komisch ist, dass wenn man nur ein lcd.print(2.0) wird es drucken genau das, was Sie wollen. Keine Notwendigkeit für sprintf oder nicht. Und Sie können angeben, die Anzahl der Ziffern rechts dezimal, mit einem optionalen zweiten parameter. E. g. lcd.print(2,3) geben Sie "2.000".
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die GNU-toolchain für AVRs (die im Lieferumfang der Arduino-IDE) verwendet eine "minified" - version von der C standard-Bibliothek Standard, in dem zum Beispiel die floating-point-support reduziert/weggenommen formatierte I/O-Funktionen (nur um
printf()
passen in den paar KByte lange Lagerung der span.)Wenn Sie funktionieren soll, müssen Sie link gegen eine andere Bibliothek, die die normale version
printf()
durch die Verwendung der-Wl,-u,vfprintf -lprintf_flt
linker flags.Vom
avr-libc
Dokumentation:Beachten Sie, dass wenn Ihre MCU hat keine floating-point-Unterstützung, sollten Sie versuchen zu vermeiden, floating-point-Operationen vollständig. Die floating-point-Operationen wird mit software gemacht werden, was sehr ineffizient und braucht viel flash-Speicher.
-lprintf_min
wenn ich mich Recht erinnere (es ist schon eine Weile habe ich mich mit AVRs),libc.a
enthält die minified-Bibliothek.printf_flt
Sie haben keine floating-point-Unterstützung mitprintf
.?
statt.Ich diese ein:
und jetzt bekomme ich eine ascii-char, wenn ich ein Wert von 0-255 über den usb.
Ich sollte einen Weg finden, konvertieren Sie die ascii-char zu int.
e.g i Typ 65, und es gibt Eine
Habe ich einige alte code, die helfen könnten, wenn Sie vermeiden wollen printf vollständig und müssen einfach zu drucken, die eine bestimmte Anzahl von Ziffern vor und nach dem Komma. Dieser code kompiliert in C und funktioniert gut in der Arduino-IDE als auch. Es könnte fast sicher sein, getan in weniger Zeilen C++. Die pow10 könnte programmgesteuert ausgeführt werden, aber die Kräfte waren nicht unterstützt in der version von C arbeite ich mit:
Können Sie mit ihm spielen und sehen, es laufen hier:
http://ideone.com/AtYxPQ