sprintf

Moin,
ich habe da ein Problem mit der Funktion sprintf.
Ich versuche mit Hilfe dieser Funktion ein Float in ein Chararray “umzuwandeln”.
Mit Integer funktioniert diese Methode, allerdings wird mir bei Übergabe eines Floats blos ein “?”
angezeigt.

Code:

char text[6];

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  sprintf(text, "%.2f", 22.23f);
  Serial.println(text);
  delay(1000);
}

Kann mir jeman sagen, was ich falsch gemacht habe?

serial.print unterstützt kein float, man kann Sketch aber entsprechend erweitern. (Es gibt schon einen thread darüber, finde ihn aber grade nicht)

edit - hier ist er! http://forum.arduino.cc/index.php?topic=247968.0

serial.print unterstützt kein float, man kann Sketch aber entsprechend erweitern.

Serial.print() macht Float. printf() auf dem Arduino allerdings nicht

Du kannst die Nachkomma-Stellen von Float einfach mit print() bestimmen: http://arduino.cc/en/Serial/Print

float f = 22.123;
Serial.println(f, 2);

Wieso printf() auf dem Arduino nicht geht, ist in dem anderen Thread erklärt.

dtostrf() ist auch eine Alternative in manchen Situationen: http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html#ga060c998e77fb5fc0d3168b3ce8771d42 http://www.mikrocontroller.net/topic/86391 Damit kann man einzelne Floats schön formatieren. Nur nicht innerhalb es Format-Strings wie bei printf()

...es ging doch um sprintf, nicht um printf...:?:

http://forum.arduino.cc/index.php?topic=247968.msg1772080#msg1772080

Das ist praktisch das gleiche. printf() schreibt direkt auf einen Stream. Das ist aber auf dem Arduino auch nicht implementiert. Das kann man aber so hinbiegen dass er damit direkt auf die serielle Schnittstelle schreibt.

s(n)printf() geht wie printf() aber schreibt statt in dem Stream in einen Puffer. “s” steht hier für “string”:
http://www.cplusplus.com/reference/cstdio/sprintf/

Aber die ganzen Varianten von printf() und scanf() verwenden die gleiche unterliegenden Funktionen.
vfprintf():
http://www.nongnu.org/avr-libc/user-manual/group__avr__stdio.html#gaa3b98c0d17b35642c0f3e4649092b9f1
und vfscanf():
http://www.nongnu.org/avr-libc/user-manual/group__avr__stdio.html#ga67bae1ad3af79809fd770be392f90e21

Wegen dem Patch:
Den würde ich übrigens nur auf einer Arduino Version < 1.5.7 verwenden, da er glaube ich Teile der avr libc überschreibt. Oder sogar komplett. In 1.5.7. wird diese aber auf eine neuere Version aktualisiert.

Das ist von Arduino Seite einfach unschön gelöst. Es gibt in dem Verzeichnis sogar entsprechende Dateien für die minimale und die Float Implementierung: libprintf_flt und libscanf_min
Aber von der Arduino Software wohl keine Schnittstelle wo man sich da einklinken kann

Also, ich habe das jetzt über die Patches gemacht, das funktioniert zumindest für den 328P einwandfrei (andere habe ich noch nicht geteste :D).

Danke für die Hilfe ;)

@Serenifly: Benutze die 1.0.5er

ich habe die 1.5.6r2 für meinen Uno168, mit der 1.5.7 werde ich dann aufpassen.