Go Down

Topic: formatierte serielle Ausgabe: sprintf Fehler bei floats (?) (1.5.6.r2) (Read 245 times) previous topic - next topic

HaWe

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

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?
Gruß,
Helmut

Serenifly

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:
http://forum.arduino.cc/index.php?topic=124809.msg940922#msg940922
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.

HaWe

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

HaWe

uuups...
wo soll man denn hier jetzt die libc.a  überall ersetzen?
wirklich überall...?
Gruß,
Helmut

Serenifly

Jeder Prozessor hat da seine eigene Lib

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

HaWe

hab ich's mir fast gedacht... ;)
welcher ist denn für den Uno bzw. meinen 2009 (ATMega128) ?
Gruß,
Helmut

HaWe

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

Code: [Select]

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! :)
Gruß,
Helmut

Go Up