Pages: [1]   Go Down
Author Topic: formatierte serielle Ausgabe: Fehler bei floats (?) (1.5.6.r2)  (Read 147 times)
0 Members and 1 Guest are viewing this topic.
Online Online
Sr. Member
****
Karma: 11
Posts: 350
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hallo,
ich habe festgestellt, dass floats nicht richtig ausgegeben werden (1.5.6.r2):
Code:
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?
Logged

Offline Offline
Faraday Member
**
Karma: 104
Posts: 3610
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Online Online
Sr. Member
****
Karma: 11
Posts: 350
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Online Online
Sr. Member
****
Karma: 11
Posts: 350
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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


* lib_c.png (60.15 KB, 956x446 - viewed 13 times.)
Logged

Offline Offline
Faraday Member
**
Karma: 104
Posts: 3610
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Jeder Prozessor hat da seine eigene Lib

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

Online Online
Sr. Member
****
Karma: 11
Posts: 350
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hab ich's mir fast gedacht... smiley-wink
welcher ist denn für den Uno bzw. meinen 2009 (ATMega128) ?
Logged

Online Online
Sr. Member
****
Karma: 11
Posts: 350
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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! smiley
Logged

Pages: [1]   Go Up
Jump to: