dtostrf - Aneinander hängende Zahlen

Hi, habe ein Problem mit

dtostrf()

void DisplayBeschreiben()
{
    dtostrf(MesswertTKopf,8, 5, dtostrfbufferTKopf);
    dtostrf(MesswertTKWasser,8, 5, dtostrfbufferTKWasser);
    dtostrf(MesswertTStickstoff,8, 5, dtostrfbufferTStickstoff);
    dtostrf(MesswertTUmgebung,8, 5, dtostrfbufferTUmgebung);
    Serial.print("TKopf: ");
    Serial.println(MesswertTKopf);
    Serial.print("TKH20: ");
    Serial.println(MesswertTKWasser);
    Serial.print("TN2: ");
    Serial.println(MesswertTStickstoff);
    Serial.print("TU; ");
    Serial.println(MesswertTUmgebung);
    LCDText="TKopf: " + String(dtostrfbufferTKopf);
    LCDZwZeile="TKH20: " + String(dtostrfbufferTKWasser);
    LCDDrZeile="TN2: " + String(dtostrfbufferTStickstoff);
    LCDVierteZeile="TU: "+ String(dtostrfbufferTUmgebung);
    LCDWriteVier(LCDText, LCDZwZeile, LCDDrZeile, LCDVierteZeile);
}

Der hängt hier immer alle Zahlen aneinander in folgender Form:

Angenommen die Zahlen sind 20.00000 , 30.00000, 40.00000,50.00000

Dan hab ich in der ersten Zeile
20.0000030.000004.0000050.00000
Zweite Zeile:
30.0000040.0000050.00000
Dritte Zeile:
40.0000050.00000
Vierte Zeile:
50.00000

Hat jemand ne Idee wie ich das Problem beheben kann?

Arghmano:
Hat jemand ne Idee wie ich das Problem beheben kann?

Du als Programmierer müßtest selbst darauf achten, dass Du in einer Zeile nicht mehr Zeichen auszugeben versuchst als die Zeile lang ist.

In die jeweils nachfolgende Zeile müßtest Du die Schreibmarke selbst versetzen (lcd.setcursor) statt über das Zeilenende drüberzuschreiben.

Und wenn Du Dich nicht dran hältst und einfach versuchst mehr Zeichen in einer Zeile auszugeben als die Zeile Zeichen hat, hängt es von der Art des Displays, der Zeilen- und Zeichenzahl und der internen Speicherstruktur ab, wo der Controller die Zeichen auf dem Display hin platziert.

P.S.: Zu Deinem geposteten Code kann man wenig sagen, da Du nur einen Code-Ausschnitt, aber nicht vollständige Deklarationen und verwendete Funktionen gepostet hast. Außerdem verwendest Du String-Objekte, die zu vielen Libraries einschließlich der Standardlibrary AVR libc inkompatibel sind.

??

Ich schreibe nicht über eine Zeile hinaus, dtostrf klebt mir alle Zahlen in eine Variable aneinander.

Nochmal:

Ich führe dtostrf 4x aus

sagen wir die entstehenden Variablen sollten sein:

A, B, C, D und die Zahlen 20,30,40 und 50.

Das Ergebnis ist :
A=20304050
B=304050
C=4050
D=50

Das hat doch rein garnichts mit meinem Beschreiben des Displays zu tun. Auch im Serial, wenn ich die Variablen abfrage, erhalte ich diese Zahlen.

Mein Code sollte nur die vierfache Ausführung des Befehls darstellen. Ich möchte ungern die restlichen 1700 Zeilen Code posten, wenn ihr einschränken könnt, wo das Problem entstehen könnte, kann ich den part posten, falls z.B. eine Library oder eine bestimmte Funktion der Grund dafür sein könnte.

Das Problem liegt meines erachtens aber eher bei der dtostrf Funktion. Könnte die IDE Version schuld sein?

Poste mal die Deklaration der Puffer Arrays. Nicht dass du da irgendwas überschreibst, weil z.B. die Puffer zu klein sind.

EDIT:
Das kann z.B. daher kommen wenn du vergessen hast, dass die Arrays Null-terminiert werden müssen und daher 1 größer als die Länge sein müssen (9 in deinem Fall). Wenn du dann 4 Arrays der Länge 8 nacheinander anlegst, ist es sehr wahrscheinlich dass der nächste dtostrf() Aufruf den Terminator überschreibt. Danach sieht es fast aus.

Arghmano:
Ich möchte ungern die restlichen 1700 Zeilen Code posten, wenn ihr einschränken könnt, wo das Problem entstehen könnte, kann ich den part posten, falls z.B. eine Library oder eine bestimmte Funktion der Grund dafür sein könnte.

Dann poste mal die Deklaration der Variablen:
dtostrfbufferTKopf
dtostrfbufferTKWasser
dtostrfbufferTStickstoff
dtostrfbufferTUmgebung

Die sind wahrscheinlich zu kurz definiert (8 statt Minimum 9 für eine zweistellige Zahl mit fünf Nachkommastellen?) und können daher womöglich das abschließende Nullzeichen im String nicht mehr aufnehmen, so dass das Nullzeichen immer in die nachfolgende Variable geschrieben wird und im eigentlichen Puffer dann fehlt.

static char dtostrfbuffer[8]; //Zwischenspeicher der Floatvariablen um sie als String auf dem Display ausgeben zu können
static char dtostrfbufferU[8];
static char dtostrfbufferZuvor[8];
static char dtostrfbufferTKopf[8];
static char dtostrfbufferTKWasser[8];
static char dtostrfbufferTStickstoff[8];
static char dtostrfbufferTUmgebung[8];

das sind die Deklarationen, du könntest recht haben, dass das zu kurz ist. Müsste ich nicht sogar 10 als Länge nehmen? für +/- noch? Also "+/-"yx.yxyxy"\n". Das probier ich morgen mal aus, danke! Hab leider nur den Code hier, die Hardware liegt im Geschäft

Arghmano:
das sind die Deklarationen, du könntest recht haben, dass das zu kurz ist. Müsste ich nicht sogar 10 als Länge nehmen? für +/- noch? Also "+/-"yx.yxyxy"\n". Das probier ich morgen mal aus, danke! Hab leider nur den Code hier, die Hardware liegt im Geschäft

Wegen Plus nicht, das wird ja nicht erzeugt, aber wegen Minus bei Zahlen bis runter zu
"-99.99999" plus abschließendes Nullzeichen
muss die Breite schon mindestens 10 betragen, falls solche Werte auftreten können.

Momentan können sie das noch, auf Grund eines Offsets. Dann hau ich da morgen mal ne 10 rein, hoffe es klappt dann :slight_smile:

Wird sicher gehen :slight_smile:

Alles klar, funktioniert wie gewünscht :slight_smile:

Wieder was gelernt! Danke !