INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Probleme mit sprintf() und dtostrf()
07.06.2016, 11:16 (Dieser Beitrag wurde zuletzt bearbeitet: 07.06.2016 15:41 von GMBU.)
Beitrag #1
Probleme mit sprintf() und dtostrf()
Ich möchte einen Float Wert auf der Schnittstelle ausgeben, muss aber für die Datenerfassung dafür sorgen das eine feste Anzahl an Ziffern exsistiert.
Also ich brauch die Form 0123.45

Zunächst hab ich gelesen das man dafür sprintf() benutzt. Hat nicht funktioniert.
Dann hab ich gelesen das sprintf() auf Arduino nicht unterstützt wird für float Werte.
Stattdessen soll man dtostrf() verwenden.
Da bekomme ich aber die Fehlermeldung error: 'dtostrf' was not declared in this scope , was etwas überraschend war.
Leider konnte ich nicht ermitteln welche .h ich einbinden muss, keine der vermuteten funktionierte. Anderen ging es offenbar ebenso wie ich lesen konnte.

Ich binde derzeit nur die Wire.h ein für die I2C.

Eine andere Befürchtung wäre: dtostrf ist eine Standard avr-libc Funktion. Ich verwende einen Arduino M0 bzw Zero. Könnte das Problem daher kommen? Das die gar nicht verfügbar sind ?

Wie wäre dann die Lösung um zu meinen vorgestellten 0 zu kommen ?

Fortschritte....
Mit einem SAM Core Arduino ist es erforderlich das include in ein subdirektory umzulenken ,auf
Code:
#include <avr/dtostrf.h>

dann ist der Error schon mal weg.

Aber ich bekomme in der Ausgabe leider gar keine Zahlen angezeigt:
Code:
....
#include <avr/dtostrf.h>
....
char str_temp[7];
.....
SerialUSB.print("RDW");
dtostrf(DW_BIN_RK_F,4,2,str_temp);
SerialUSB.print(str_temp);

Sobald ich versuche statt der normalen Float Zahl die gestringte Zahl mit festem Format auszugeben bekomme ich gar keine Ziffern mehr angezeigt, nur noch das "RDW".
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.06.2016, 16:58
Beitrag #2
RE: Probleme mit sprintf() und dtostrf()
Hallo GMBU,

versuche es einmal so:
Code:
Serial.begin(9600);
float f = 14.5664; // der Float aus dem Sensor
char buf[8]; // Pufferarray für Character (Anzahl Zeichen +1)
dtostrf(f, 7, 2,buf); // 7 Stellen inkl. Punkt, davon 2 hinter dem Punkt
Serial.print(F(buf));
Das
Code:
#include <avr/dtostrf.h>
brauchst du eigentlich nicht!
Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.06.2016, 07:58
Beitrag #3
RE: Probleme mit sprintf() und dtostrf()
Hallo,

ok, dein Code ist ja prinzipiell das gleiche wie meiner, bis auf das (F(buf)) beim Print. Ich setze ihn mal bei mir ein und probiers mal..... nichts. Keine Zahlen.
Ich brauch das #include <avr/dtostrf.h>, ohne gings nicht. Liegt wohl am Arduino Typ, weil es kein AVR ist.
Software ist Version 1.7.9


(07.06.2016 16:58)rkuehle schrieb:  Hallo GMBU,

versuche es einmal so:
Code:
Serial.begin(9600);
float f = 14.5664; // der Float aus dem Sensor
char buf[8]; // Pufferarray für Character (Anzahl Zeichen +1)
dtostrf(f, 7, 2,buf); // 7 Stellen inkl. Punkt, davon 2 hinter dem Punkt
Serial.print(F(buf));
Das
Code:
#include <avr/dtostrf.h>
brauchst du eigentlich nicht!
Grüße Ricardo
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.06.2016, 10:16 (Dieser Beitrag wurde zuletzt bearbeitet: 08.06.2016 10:17 von SkobyMobil.)
Beitrag #4
RE: Probleme mit sprintf() und dtostrf()
Hallo,
dieses "sprintf() und dtostrf()" ist in Verbindung mit "float" mit Vorsicht
zu genießen. Das hat mächtige Tücken mit "float" wenn es darum geht, einen
Wert von 73.19 zu übertragen.

Diesen Wert sollte man eigentlich in Byte zerlegen, dann übertragen und danach
wieder zusammensetzen. Das ist sicher. So sieht das eigentlich im Grunde aus:

Code:
float temp = -11.7;
  byte * b = (byte *) &temp;
  Serial.write(b[3]);
  Serial.write(b[2]);
  Serial.write(b[1]);
  Serial.write(b[0]);

oder so:

Code:
float temp = -11.7;  
byte * b = (byte *) &temp;
  
  Serial.write(b,4);

hier ist noch etwas:

Code:
typedef union {
  float floatingPoint;
  byte binary[4];
} binaryFloat;

void setup() {
  // put your setup code here, to run once:
  binaryFloat hi;
  hi.floatingPoint = -11.7;
  Serial.begin(115200);
  Serial.write(hi.binary,4);
}

Im Grunde soll das ganz einfach sein, aber ich habe das ums verrecken nicht
kapiert. Aber es gibt eine geniale Lösung zum übertragen von Werten…

Das Zauberwort heißt "I2C - Two-Wire Peripheral Interface - for Arduino"
und dort, "Send and receive any data type"

Die Lib dazu gibt es hier.

Ich habe versucht, von einem Mega zu einem Uno "float" zu übertragen. Also
"float" zerlegen, senden und auf der anderen Seite wieder zusammensetzen-
keine Chance, bin zu blöde dafür.
Mit der Lib funktionierte es auf anhieb.

"Retian" hat das hier im Forum mal angeschnitten, der macht es ohne Lib. Hat
aber leider nicht verraten, wie er es gemacht hat.

Gruß und Spaß
Andreas
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.06.2016, 12:15
Beitrag #5
RE: Probleme mit sprintf() und dtostrf()
Ich habe gelesen das sprintf für float auf Arduino nicht unterstützt wird aus Leistungsgründen und deswegen gerade dtostrf verwenden soll weil das mit float funktioniert.
Wobei das Problem beim M0 obsolet sein sollte.

Ich vermute eigentlich das ich schon irgendwo was falsch mache.

Leider geht es bei mir um eine Übertragung zum PC, also nix i2C.
Händische Zerlegung der Zahlen zu Ziffen. Ja, das sollte wohl funktionieren, ich probiers mal kurz. Aber etwas umständlich ist es schon, ich glaube das hab ich das letzte mal in Assembler für die LCD Übertragung gemacht :-)
Wenn ich deine ersten 2 Codebeispile so nehme kommt kauderwelsch raus, aber keine Ziffern. Das dritte hab ich auf die Schnelle jetzt nicht durchblickt.
Eigentlich gehts mir ja auch nur um führende Nullen. Schade das es dafür wohl auch keine Parameter bei .print gibt.
Vielleicht sollte man sich mal die dtostrf() Funktion direkt ansehen....





(08.06.2016 10:16)SkobyMobil schrieb:  Hallo,
dieses "sprintf() und dtostrf()" ist in Verbindung mit "float" mit Vorsicht
zu genießen. Das hat mächtige Tücken mit "float" wenn es darum geht, einen
Wert von 73.19 zu übertragen.

Diesen Wert sollte man eigentlich in Byte zerlegen, dann übertragen und danach
wieder zusammensetzen. Das ist sicher. So sieht das eigentlich im Grunde aus:

Code:
float temp = -11.7;
  byte * b = (byte *) &temp;
  Serial.write(b[3]);
  Serial.write(b[2]);
  Serial.write(b[1]);
  Serial.write(b[0]);

oder so:

Code:
float temp = -11.7;  
byte * b = (byte *) &temp;
  
  Serial.write(b,4);

hier ist noch etwas:

Code:
typedef union {
  float floatingPoint;
  byte binary[4];
} binaryFloat;

void setup() {
  // put your setup code here, to run once:
  binaryFloat hi;
  hi.floatingPoint = -11.7;
  Serial.begin(115200);
  Serial.write(hi.binary,4);
}

Im Grunde soll das ganz einfach sein, aber ich habe das ums verrecken nicht
kapiert. Aber es gibt eine geniale Lösung zum übertragen von Werten…

Das Zauberwort heißt "I2C - Two-Wire Peripheral Interface - for Arduino"
und dort, "Send and receive any data type"

Die Lib dazu gibt es hier.

Ich habe versucht, von einem Mega zu einem Uno "float" zu übertragen. Also
"float" zerlegen, senden und auf der anderen Seite wieder zusammensetzen-
keine Chance, bin zu blöde dafür.
Mit der Lib funktionierte es auf anhieb.

"Retian" hat das hier im Forum mal angeschnitten, der macht es ohne Lib. Hat
aber leider nicht verraten, wie er es gemacht hat.

Gruß und Spaß
Andreas
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.06.2016, 12:50
Beitrag #6
RE: Probleme mit sprintf() und dtostrf()
Hallo,
"Leider geht es bei mir um eine Übertragung zum PC"
dann habe ich das falsch verstanden.
Gruß und Spaß
Andreas
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.06.2016, 15:17
Beitrag #7
RE: Probleme mit sprintf() und dtostrf()
Tja, nun gibt es zwei Möglichkeiten. Entweder weiter im Nebel rumstochern oder der bisherige Code wird einfach mal rein gestellt.
@GMBU
Zitat:ok, dein Code ist ja prinzipiell das gleiche wie meiner, bis auf das (F(buf)) beim Print
... und der richtigen Anzahl von Bytes für den Puffer, sowie der richtigen Parameter für dtostrf() Big Grin
Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.06.2016, 15:40
Beitrag #8
RE: Probleme mit sprintf() und dtostrf()
Ja, da hast du recht.
Es funktioniert aber auch mit deinem Code nicht.

Ich habe mir gerade mal die dtostrf.h bzw die dtostrf.c angesehen unter
C:\Program Files (x86)\Arduino\hardware\arduino\sam\cores\arduino\avr

Ich bin ja nicht so die große Leuchte im coden, aber wenn ich das richtig sehe verwendet die dtostrf Funktion jetzt intern die sprintf() Funktion. Wenn diese jedoch nicht supportet wird für float würde es erklären warum nichts funktioniert. Aber wie gesagt, ich bin nicht so der Codeleser.

Im amerikanischen Forum habe ich auch Hinweise darauf gefunden das seit Anpassung ( Aktualisierung) der AVR Lib nicht immer alles funktioniert wie es soll mit den Funktionen und großen Zahlen.

Ich behelfe mir zwischenzeitlich auf die simple Weise:

if Wert <1000 serialprint 0
if Wert <100 serialprint 0
if Wert <10 serialprint 0
serialprint Wert

Damit bekomme ich im Prinzip immer meine feste Stringlänge, mit 4 ziffern vor und zwei Ziffern nach dem Komma.

so als Notworkaround.

Wäre trotzdem schöner sprintf oder dtostrf würden funktionieren.

(08.06.2016 15:17)rkuehle schrieb:  Tja, nun gibt es zwei Möglichkeiten. Entweder weiter im Nebel rumstochern oder der bisherige Code wird einfach mal rein gestellt.
@GMBU
Zitat:ok, dein Code ist ja prinzipiell das gleiche wie meiner, bis auf das (F(buf)) beim Print
... und der richtigen Anzahl von Bytes für den Puffer, sowie der richtigen Parameter für dtostrf() Big Grin
Grüße Ricardo
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
Big Grin Probleme mit pgm_read_word NoGi 9 1.314 23.04.2017 10:09
Letzter Beitrag: NoGi
  Probleme mit einem Sketch für einen LED Cube 5x5x5 Frank1234 5 404 13.03.2017 12:12
Letzter Beitrag: Tommy56
  Probleme bei Countdown ferdi 0 263 23.01.2017 10:45
Letzter Beitrag: ferdi
  ArduinoDroid Probleme Brother Tak 1 420 10.09.2016 22:12
Letzter Beitrag: Brother Tak
  Roboter-Bau Probleme blebbens 8 640 12.07.2016 07:35
Letzter Beitrag: Binatone
  Makeblock mit Scratch programmieren- Probleme Keinen Schimmer 6 2.088 06.05.2016 18:34
Letzter Beitrag: arduinopeter
  Programme vom UNO auf nano , mini Pro portieren Probleme anwo 19 1.823 17.04.2016 21:12
Letzter Beitrag: hotsystems
  Probleme beim Auslesen eines IR Empfängers linuxpaul 7 864 06.03.2016 14:44
Letzter Beitrag: hotsystems
  I²C vom NANO zum PI Probleme mit High/Low Bit Tobias1984 4 511 29.02.2016 00:00
Letzter Beitrag: hotsystems
  Probleme beim auswählen des Ports Levi 11 1.996 21.02.2016 18:00
Letzter Beitrag: hotsystems

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste