formatierte serielle Ausgabe: sprintf Fehler bei floats (?) (1.5.6.r2)

hallo,
ich habe festgestellt, dass floats nicht richtig ausgegeben werden (1.5.6.r2):

void setup()
{
   // -----------------------------------------------------------------
   // TEST ! 
   char buffer [31];
   float n, a=5, b=3;
   n=sprintf (buffer, "%f plus %f is %f", a, b, a+b);   // funktioniert nicht !
                             // (Ausgabe nur '?'  '?'  '?'  statt Zahlen)

   // n=sprintf (buffer, "%d plus %d is %d", a, b, a+b); // das funktioniert !!
   // -----------------------------------------------------------------
   
   Serial.begin(9600); 
   Serial.println(buffer); 
   Serial.println(); 

}

woran kann das liegen?

Weil float auf dem Arduino nicht implementiert ist. Das ist sehr umfangreich. Deshalb hat man es in der avr libc standardmäßig weggelassen. Es gibt einen Compiler Options Schalter um das zu aktivieren, aber daran kommt man in der Arduino IDE wieder nicht so einfach ran.

Es gibt einen Patch mit fertig compilierten Datein dafür:

Aber wie da steht bläht das den Code um 1,5kB auf, auch wenn man es nicht verwendet!

Eine Alternative bei manchen Anwendungen ist die nicht-ANSI C Funktion dtostrf(). Aber die formatiert nur eine Zahl und keine Strings dazwischen:
http://www.mikrocontroller.net/topic/86391
Man kann das natürlich mit Serial.print() zusammenstückeln.

oh, danke - floats sind aber notwendig.
Dann schau ich mir mal den Patch an, danke!

uuups…
wo soll man denn hier jetzt die libc.a überall ersetzen?
wirklich überall…?

Jeder Prozessor hat da seine eigene Lib

Wenn du nach C:\Programme\Arduino\hardware\tools\avr\avr\lib gehst siehst du die ganzen Ordner.

hab ich’s mir fast gedacht… :wink:
welcher ist denn für den Uno bzw. meinen 2009 (ATMega128) ?

update:
habs jetzt einfach über alle Ordner drüberkopiert:
Klappt! :smiley:

void setup()
{
   // -----------------------------------------------------------------
   // TEST ! 
   char buffer [31];
   float n, a=5, b=3;
   n=sprintf (buffer, "%.1f plus %.1f is %.1f", a, b, a+b);   // funktioniert jetzt!

   // -----------------------------------------------------------------
   
   Serial.begin(9600); 
   Serial.println(buffer); 
   Serial.println(); 

}

void loop() {
   // put your main code here, to run repeatedly:
   while(1);
}

danke nochmal für den Link! :slight_smile: