Pages: [1]   Go Down
Author Topic: formatierte serielle Ausgabe: sprintf Fehler bei floats (?) (1.5.6.r2)  (Read 220 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
God Member
*****
Karma: 14
Posts: 675
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?
« Last Edit: July 31, 2014, 01:41:06 pm by HaWe » Logged

Gruß,
Helmut
NXC Chess Schachroboter mit Fischertechnik + Lego:  https://www.youtube.com/watch?v=Cv-yzuebC7E

Offline Offline
Faraday Member
**
Karma: 128
Posts: 4137
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

Offline Offline
God Member
*****
Karma: 14
Posts: 675
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Gruß,
Helmut
NXC Chess Schachroboter mit Fischertechnik + Lego:  https://www.youtube.com/watch?v=Cv-yzuebC7E

Offline Offline
God Member
*****
Karma: 14
Posts: 675
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 21 times.)
Logged

Gruß,
Helmut
NXC Chess Schachroboter mit Fischertechnik + Lego:  https://www.youtube.com/watch?v=Cv-yzuebC7E

Offline Offline
Faraday Member
**
Karma: 128
Posts: 4137
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

Offline Offline
God Member
*****
Karma: 14
Posts: 675
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) ?
« Last Edit: July 31, 2014, 01:41:43 pm by HaWe » Logged

Gruß,
Helmut
NXC Chess Schachroboter mit Fischertechnik + Lego:  https://www.youtube.com/watch?v=Cv-yzuebC7E

Offline Offline
God Member
*****
Karma: 14
Posts: 675
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
« Last Edit: July 31, 2014, 01:41:21 pm by HaWe » Logged

Gruß,
Helmut
NXC Chess Schachroboter mit Fischertechnik + Lego:  https://www.youtube.com/watch?v=Cv-yzuebC7E

Pages: [1]   Go Up
Jump to: