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
  ArduinoDroid Probleme Brother Tak 1 204 10.09.2016 22:12
Letzter Beitrag: Brother Tak
  Roboter-Bau Probleme blebbens 8 379 12.07.2016 07:35
Letzter Beitrag: Binatone
  Makeblock mit Scratch programmieren- Probleme Keinen Schimmer 6 966 06.05.2016 18:34
Letzter Beitrag: arduinopeter
  Programme vom UNO auf nano , mini Pro portieren Probleme anwo 19 1.176 17.04.2016 21:12
Letzter Beitrag: hotsystems
  Probleme beim Auslesen eines IR Empfängers linuxpaul 7 574 06.03.2016 14:44
Letzter Beitrag: hotsystems
  I²C vom NANO zum PI Probleme mit High/Low Bit Tobias1984 4 331 29.02.2016 00:00
Letzter Beitrag: hotsystems
  Probleme beim auswählen des Ports Levi 11 829 21.02.2016 18:00
Letzter Beitrag: hotsystems
  IRemote probleme mit abfrage schnutzkurt 18 1.150 20.02.2016 01:30
Letzter Beitrag: SkobyMobil
  Probleme mit SPI - Ethernet und nRF24L01 itsy 35 2.981 21.11.2015 19:59
Letzter Beitrag: ardu_arne
  ESP8266 EEPROM Probleme Pf@nne 5 2.448 09.10.2015 18:00
Letzter Beitrag: Pf@nne

Gehe zu:


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