Da Sie sich auf einer Embedded-Plattform befinden, ist es durchaus möglich, dass Sie nicht über die volle Funktionalität der printf()
-Funktionen verfügen.
Angenommen, Sie Schwimmer überhaupt haben (noch nicht unbedingt ein für eingebettete Sachen gegeben), können Sie es mit so etwas wie emulieren kann:
char str[100];
float adc_read = 678.0123;
char *tmpSign = (adc_read < 0) ? "-" : "";
float tmpVal = (adc_read < 0) ? -adc_read : adc_read;
int tmpInt1 = tmpVal; // Get the integer (678).
float tmpFrac = tmpVal - tmpInt1; // Get fraction (0.0123).
int tmpInt2 = trunc(tmpFrac * 10000); // Turn into integer (123).
// Print as parts, note that you need 0-padding for fractional bit.
sprintf (str, "adc_read = %s%d.%04d\n", tmpSign, tmpInt1, tmpInt2);
Sie werden beschränken müssen, wie viele Zeichen kommen, nachdem das Dezimalsystem basiert über die Größe deiner Ganzzahlen.Bei einer 16-Bit-Ganzzahl mit Vorzeichen sind Sie beispielsweise auf vier Ziffern beschränkt (9.999 ist die größte Zehnerpotenz, die dargestellt werden kann).
Es gibt jedoch Möglichkeiten, dies zu handhaben, indem Sie den Bruchteil weiterverarbeiten und ihn jedesmal um vier Dezimalstellen verschieben (und den Ganzzahlteil verwenden/subtrahieren), bis Sie die gewünschte Genauigkeit haben.
Update:
Ein letzter Punkt, den Sie erwähnten, dass Sie avr-gcc
in einer Antwort auf eine der anderen Antworten wurden unter Verwendung. Ich habe die folgende Webseite gefunden, die zu beschreiben scheint, was Sie tun müssen, um %f
in Ihren printf()
Anweisungen here zu verwenden.
Wie ich ursprünglich vermutet habe, müssen Sie zusätzliche Beinarbeit leisten, um Gleitkommaunterstützung zu bekommen. Dies liegt daran, dass eingebettete Sachen selten Gleitkommazahl benötigen (zumindest nichts von dem, was ich jemals getan habe). Sie müssen zusätzliche Parameter in Ihrem Makefile festlegen und mit zusätzlichen Bibliotheken verknüpfen.
Dies wird jedoch wahrscheinlich Ihre Code-Größe aufgrund der Notwendigkeit, allgemeine Ausgabeformate zu handhaben ziemlich viel erhöhen. Wenn Sie Ihre Float-Ausgaben auf 4 Dezimalstellen oder weniger beschränken können, würde ich vorschlagen, meinen Code in eine Funktion umzuwandeln und nur diese zu verwenden - es wird wahrscheinlich viel weniger Platz einnehmen.
Falls das jemals Link verschwindet, was Sie tun müssen, ist sicherzustellen, dass Ihr gcc Befehl "-Wl,-u,vfprintf -lprintf_flt -lm
“hat Dies führt zu:.
- Kraft vfprintf zunächst nicht definiert werden (so dass der Linker zu lösen hat it).
- geben sie die Floating-Point-
printf()
Bibliothek für die Suche.
- die Mathematik-Bibliothek angeben für die Suche.
Welche C-Bibliothek verknüpfen Sie gegen? – sybreon
Hinweis: Sie versuchen, ein Double zu formatieren. Mit Varargs wird der Compiler einen Float-Wert automatisch verdoppeln. – Richard
"Embedded", Jungs. Das ist der Schlüssel. Es spielt keine Rolle, was Ihre Fancy-Shmany-Bibliotheken auf Ihren Rechnern mit GB Speicher machen :-) Embedded-Plattformen haben in der Regel Kompromisse, die auf minimalen Speicherbedarf abzielen. – paxdiablo