ich habe ein programm das alle 20sec Daten von einem controller auf
einen anderen überträgt. Auf einem tft werden Text und Zahlenwerte
angezeigt. Nach etwa einem Tag fällt die Übertragung des Textes aus -
Zahlenwerte werden weiter angezeigt obwol Zahlen und text die gleiche
Funktion benutzen. lcd_write("123test456"); wird nicht mehr angezeigt.
Woran kann das liegen?
Das sind die Funktionen:
Direkt in dem Code sehe ich keinen Fehler (abgesehen von den
überflüssigen Zeilen mit curposx). Hast du irgendwo einen Überlauf, der
sich erst nach einem Tag beobachtbar macht? Oder läuft der Speicher
voll? Sind die Texte auch immer mit '\0' abgeschlossen?
Thomas schrieb:> Sind die Texte auch immer mit '\0' abgeschlossen?
Nein, das ist der einzige Unterschied zu Ziffernfolgen:
lcd_write("123test456");
./.
uint8_t dum[4]={' ',' ',48,'\0'};
lcd_write(dum);
Aber durch '\' wird doch nur das Ende des strings angezeigt. Nach dem
letzten Zeichen ist der string doch ohnehin zu Ende?
> Was passiert, wenn diese Funktion jemals einen Leerstring übergeben> bekommt?
Weiß ich nicht, passiert eigentlich nicht.
grundschüler schrieb:> lcd_write("123test456");
Bei einem solchen String-Literal ist die Null am Ende automatisch mit
drin.
> Nach dem letzten Zeichen ist der string doch ohnehin zu Ende?
Nein. In C sind Strings zuende, wenn eine Null kommt. Wenn keine Null
kommt, liest die Routine solange zufällig im Speicher weiter, bis eine
kommt. Der Cursor wird dann natürlich sonstwohin gestellt.
> > Was passiert, wenn diese Funktion jemals einen Leerstring übergeben> > bekommt?> Weiß ich nicht
Dann geh der Frage mal nach. Ein bißchen Knobelei muß für Dich ja auch
noch übrig bleiben. :-)
Nop schrieb:> Bei einem solchen String-Literal ist die Null am Ende automatisch mit> drin.
Das ist natürlich richtig, wusste ich früher auch mal.
Ich such ja erstmal eine Erklärung.
die lcd_write - Funktion müsste grundsätzlich in Ordnung sein.
"123test456" wird zur Laufzeit irgendwo in den RAM geschrieben. kann es
sein dass sich der Ram dadurch verbraucht und irgendwann kein Platz für
weiteren Text vorhanden ist?
Macht es Sinn, für solchen Text festen Speicher - u8 dum[] - anzulegen?
geändert.
Der im Ram abgelegte String wird korrekt geschrieben.
Es ist also kein Problem mit der Funktion lcd_write, sondern ein
Speicherüberlaufproblem. Durch das ständige Schreiben von Text aus dem
Programmcode entsteht ein Speicherüberlauf. Ist das normal oder ein
Fehler in meinem Programm???????
grundschüler schrieb:> Ist das normal oder ein Fehler in meinem Programm???????
Wenn auch nur ein einziges mal irgendwo durch Umkopieren oder so ein
Leerstring übergeben wird, knallt es sowieso, weil lcd_write das nicht
abfängt.
ui schrieb:> grundschüler schrieb:>> while(*str>31)>> und was soll das bitte abfangen?
lcd_char holt Daten aus einem font. Der Font fängt mit ' '=32 an. Unter
32 findet lcd_char im font nichts.
grundschüler schrieb:> Wenn im String ein Zeichen <' ' ist, ist irgendwas schief gelaufen. Dann> ist der Abbruch gewollt. Kann aber eigentlich nicht passieren.
Wieso?
Hast du dir mal das Character-Set eines HD44780 angeschaut?
grundschüler schrieb:> nach ca. 2h wird nur noch die Variante thm angezeigt.
Du hast ein Speicherproblem, z.B. einen wildgewordenen Pointer, der Dir
Teile des SRAM überschreibt.
Das Umstellen des Codes ändert nur die Stelle, wo Du den Fehler
bemerkst.
Den Code, der den Fehler enthält, hast Du bisher nicht gezeigt.
Sicher, daß Du *buff++ meinst und nicht (*buff)++?
*buff++ liefert das zurück, worauf buff zeigt (was dann aber nicht
verwendet wird) und erhöht dann den Zeiger buff.
Außerdem ist die Schleife bei 4xheader + payload schon wieder
fußgesteuert und wird nicht klappen, wenn die empfangene Länge 0 ist.
Nop schrieb:> Sicher, daß Du *buff++ meinst und nicht (*buff)++?
Das werd ich in Ruhe prüfen. Allerdings werden die Daten ja korrekt
übertragen. Da ist es unwahrscheinlich, dass der Fehler in der
Berechnungsroutine steckt. Eher pointer - aber ich finde keinen
undefinierten.
Wenn Du len = 2 empfängst, muß buff mindestens 258 Byte groß sein, ist
das der Fall?
Wenn nicht, dann mußt Du len abtesten, damit buff nicht überläuft.
Nop schrieb:> Sicher, daß Du *buff++ meinst und nicht (*buff)++?
Nein, er meint eigentlich nur buff++.
grundschüler schrieb:> Kann eigentlich nur die onewire-empfangsroutine sein:
In die Funktion würde ich auf jeden Fall mal einen Überlaufschutz
einbauen. In ihrer jetzigen Form ist die in den Puffer geschriebene
Menge von äußeren Einflüssen abhängig. Was ist z.B. wenn das Paket
defekt ist und die Längeninfo im Paket daher zu groß ist?
Peter D. schrieb:> len = 2
Das könnte der Fehler sein. len ist das 2.Feld und gibt die Anzahl der
zu übertragenden bytes an. len-2 weil 2 bytes schon gelesen sind. Wenn
da durch Übertragungsfehler ein Überlauf und damit ein Wert größer als
der buffer steht, kann es zu Fehlern kommen. Ich werde da einen Abbruch
einbauen für den Fall, dass len größer als der buffer wird.
Wer denkt denn an so was...
Stefan E. schrieb:> einen Überlaufschutz einbauen
über 24h ohne Fehler, das wars dann wohl. Alleine hätte ich das nicht
gefunden. Danke für alle Beiträge.
Dieter F. schrieb:> Die Salami-Taktik beim Code-Zeigen
naja, ohne Eingrenzug des Problems wärs bei umfangreichem Code
wahrscheinlich auch nicht gegangen.
grundschüler schrieb:> naja, ohne Eingrenzug des Problems wärs bei umfangreichem Code> wahrscheinlich auch nicht gegangen.
Eingrenzung ja - auf lauffähigen Minimal-Code, der den Fehler beinhaltet
und nicht auf irgendwelche Fragmente - aber nur irgendwelche Teile
zeigen ist nicht nett.