Hi,
über diese Zeile bin ich gestern gestolpert:
00000000,00:00:00,,,,,,,6
Sie wurde geschrieben von meinem Programm, das Meßwerte ausgeben soll.
Hmmmmm. Also habe ich mal Google befragt und bin zu der Aussage gekommen, daß die Funktion sprintf() keine Float darstellen könne. Empfohlen wurde die Verwendung der Funktion dtostrf(). Diese habe ich in mein Programm eingebaut und nur noch gestaunt. Hier ist das Programmstück zur Ausgabe obiger Werte:
sprintf( buffer, "%04d%02d%02d,%02d:%02d:%02d,", year, month, day, hour, minute, second);
DEBUG_PRINT2USB( buffer );
myFile.print( buffer );
dtostrf(lat, 10, 6, buffer); <-- um diese Zeile geht es hier
sprintf(buffer, "%10.6f,%10.6f,", lat, lon);
DEBUG_PRINT2USB( buffer );
myFile.print( buffer );
sprintf(buffer, "%5.1f,%5.1f,", pm10, pm25);
DEBUG_PRINT2USB( buffer );
myFile.print( buffer );
sprintf(buffer, "%4.1f,%4.1f,", temperature, humidity);
DEBUG_PRINT2USB( buffer );
myFile.print( buffer );
sprintf( buffer, "%x", sampledValues);
DEBUG_PRINTLN2USB(buffer);
myFile.println( buffer );
Mit diesem Programm, also mit der Funktion dtostrf(), erhalte ich folgende Ausgabe:
00000000,00:00:00, 0.000000, 0.000000, 3.6, 2.3,20.9,41.1,6
Kommentiere ich die eine Zeile mit der Funktion dtostrf() aus, dann fehlen wieder die Floats, füge ich die Zeile wieder ein, so erhalte ich die Floats. Dabei wird in dieser Zeile ein Buffer gefüllt, der aber nicht verwendet wird.
Ergebnis: sprintf() kann Floats darstellen, wenn man die Bibliotheksroutine überlistet.
Dazu passt folgende Beobachtung: in meinem Programm verwende ich das Makro DEBUG_PRINTLN2USB. Dieses habe ich wie folgt definiert:
#define DEBUG
#ifdef DEBUG
#define DEBUG_PRINT2USB(...) debugSerial.print(__VA_ARGS__)
#define DEBUG_PRINTLN2USB(...) debugSerial.println(__VA_ARGS__)
#else
#define DEBUG_PRINT2USB(...)
#define DEBUG_PRINTLN2USB(...)
#endif
Damit unterscheide ich zwischen Debug- und Release-Version. Nehme ich jetzt den Aufruf der Funktion dtostrf() raus, dann kann das Programm die Floats in der DEBUG-Version, aber nicht mehr in der Release-Version.
Merkwürdig. Eigentlich kann die Funktion sprintf() die Floats darstellen.
Schönen Gruß
AugustQ
PS: ich arbeite mit dem seeeduino LoRaWAN with GPS, falls dies von Bedeutung ist.