Go Down

Topic: dtostrf() hängt mir immer ein A an den String an (Read 2287 times) previous topic - next topic

ids2001

Hallo Leute,

habe folgendes Problem und hier einen Testsketch mal gebastelt.
Ich möchte einen FloatWert von einem Sensor formatieren auf zB genau 2 Nachkommastellen.
sprintf() ist ja für Floats nicht so geeignet und die dtostrf() wäre hier wohl die richtige.

Jedoch wird mir hier immer ein A an den Wert angehängt.
hier der Code.

Code: [Select]

String Command;
char StrBuffer [10];
float var = 12.65346367;     
Command = dtostrf(var,6,2,StrBuffer);
Serial.print(Command);



Ausgabe am Terminalfenster: 12.65A 

wo liegt eurer Meinung nach das Problem?

Habe ich die Function so richtig verstanden?
dtostrf(die zu formatierende variable float, hier die Gesamtstellen vor und nach dem Komma inkl Vorzeichen und Dezimalpunkt, stellen nach dem Komma, charBuffer )
charBuffer Größe = Gesamtstellen ( vorzeichen, stellen vor und nach dem Komma + Dezimalpunkt ) + 1 stelle zusätzliche?


danke schon mal für die Hilfe

lg

Dieter
http://engineeringatnight.blogspot.co.at/

mkl0815

Was passiert denn, wenn Du direkt den StrBuffer per Serial.println() ausgibst?

ids2001

das A ist immer noch dran.
Bin gerade draufgekommen, dass nicht jeder Float den ich mit dtostrf formatiere ein A angehängt bekommt lol
http://engineeringatnight.blogspot.co.at/

uwefed

Hast Du die Seite http://arduino.cc/playground/Main/FloatToString bzw http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1205038401 schon gelesen?
Grüße Uwe

michael_x

Und was spricht gegen
Serial.print(var,2);
?

harding

Hallo Dieter,

normalerweise dürfte das nicht passieren.
Ich hatte aber auch schon solche komischen Phänomene wo ich mit String's was rumprogrammiert hatte. Das passierte aber nicht immer. Ich vermute dass irgend was mit der Reservierung des Speichers für die "Command" Variable schief läuft bzw. da schon was drinn steht. Manchmal hilft es die String Variable mit irgend einem Wert direkt bei der Erstellung zu initialisieren, also am besten mit Leerzeichen.

Gruß

harding

michael_x

Deiner Konstruktion
Code: [Select]
String cppString;
char cstring[] = "  3.45\000xy";  // so sollte  das Ergebnis von dtostrf(val,6,2, target); aussehen: 7 der 10 byte definiert
cppString = cstring;

traue ich nicht über den Weg, aber ...

... ausnahmsweise ist der böse String wohl nicht schuld, da :

>>Was passiert denn, wenn Du direkt den StrBuffer per Serial.println() ausgibst?
>    das A ist immer noch dran.
( Du meinst sicher " ist schon dran " )

ids2001

Hallo,

bei einer Ausgaben von Serial.println(StrBuffer) habe ich leider auch schon das A dran obwohl es nicht dranhängen soll :-)

Jedoch erfolgt in meiner Application die Ausgabe über die SoftwareSerial und da wird dieser String dann per SMS auf mein Handy geschickt. Dort finde ich dann kein A mehr dran. Parallel gebe ich für Debug Zwecke aber den selben String auch noch auf die HardwareSerial ( normale Serial.print ) aus.

Bei mir ist der String halt nur viel länger, hier im Forum ist er der Einfachheit halt eher "klein" gehalten worden.
In meiner App verarbeite ich dass hier:


hier weise ich den Var Werte nur für Testzwecke zu. Später kommen diese von Sensoren bzw werden intern errechnet
Code: [Select]

     String sms_msg=" ", msg_buffer;
     char StrBuffer [10];
     float wind = 12.65346367, wind30min = 7.5659890, wind1std = 5.345655, wind3std = 3.212039 ;
     float vmax30 = 34.746356, vmax60 = 77.73653;
     float temp = 27.655789, humidity = 67.454124;
     String richtung = "NNW", datum ="26.06.2012", uhrzeit = "07:13";
     sms_msg = "MFC:" + datum +" "+ uhrzeit +" Wind aktuell "+dtostrf(wind,0,2,StrBuffer)+"m/s aus "+ richtung + "[30min               "+dtostrf(wind30min,0,2,StrBuffer)+
               "m/s,1Std "+dtostrf(wind1std,0,2,StrBuffer)+"m/s,3Std "+dtostrf(wind3std,0,2,StrBuffer)+"m/s]vmax30min "+dtostrf(vmax30,0,2,StrBuffer)+"m/s vmax60min"+dtostrf(vmax60,0,2,StrBuffer)+
               "m/s;T&F="+dtostrf(temp,0,2,StrBuffer)+"°C/"+dtostrf(humidity,0,2,StrBuffer)+"%";
http://engineeringatnight.blogspot.co.at/

Go Up