Mega hängt sich auf

Hallo,

ich hätte bezüglich der Fehlersuche eine Frage. Ich habe eine Code mit ca. 1000 Zeilen den ich jetzt erst mal nicht poste da ich mir denken kann das in der Größe erst mal keiner lesen will. Wie gehe ich vor um den Fehler zu finden warum der Mega nach ca. einer halben Stunde aussteigt und nur durch einen Hardreset wieder in Gang kommt. Einen Verdrahtungsfehler kann ich ausschließen da auch das Board ohne Verdratung den selben Fehler aufweist. Gibt es Rutinen die ich mit einbauen kann um mir Überläufe oder ähnliches Anzeigen zu lassen an welcher Ecke es klemmt da ich mittlerweile dies bezüglich am Ende meines Latein stehe. Ich sende auch gern nach Anfrage den Code per PM. Danke schon im voraus.

Grüße Daniel

Wenn wir dir helfen sollen, muss der Sketch auch hier gepostet (in Code-Tags) werden. Dann schauen viel Augen drüber und finden "sicher" das Problem.

Allerdings kannst du zuvor selber testen, in dem du dir Ausgaben oder Variable im SerialMonitor ansehen kannst. Das ist dann wie ein debuggen.

Üblicher Weise entstehen solche Probleme durch Bereichsüberschreitungen. z.B. Stack-Heap Kollisionen Schreiben über Array Grenzen hinweg Pointer, welche in die Wiese zeigen usw.

Was geschieht denn bei ca 30 Minuten? Also wird da etwas bestimmtes geschaltet? Hier ist so einiges möglich. Es soll auch Leute geben, die es schaffen, einen Arduino Mega mit Daten voll zu schreiben (was aber dann eher auf falsche Mechanismen zurückzuführen ist). Lass dir über die Serielle Schnittstelle einmal den freien Speicher minütlich ausgeben.

Landest du ansonsten evtl. in einer Schleife, die keine gültige Abbruchbedinung hat? Ansonsten geht mein Verdacht auch eher dahin, dass du über die länge eines Arrays hinausschreibst.

Kann leider nur als Anhang hier rein stellen da sonst die Anzahl der Buchstaben überschritten werden. :o Bin Ratlos... In der Zeit passiert nichts anderes als die ganze Zeit sonst. Den Speicher hab ich mir ausgeben lassen und er zeigt immer das Selbe an.

Den Speicher hab ich mir ausgeben lassen und er Zeigt immer das selbe an.

Toll... Geheim?

Was sagt die Arduino IDE zum Speicherverbrauch?

2480Byte und 49% Speicherverbrauch in der IDE.

Diggsn: Kann leider nur als Anhang hier rein stellen da sonst die Anzahl der Buchstaben überschritten werden. :o Bin Ratlos... In der Zeit passiert nichts anderes als die ganze Zeit sonst.

Ach Du heilige Scheisse:

  char *tempstr="";  
  sprintf(tempstr,"%s%c%c%c%c","0x",Inhalt[0],Inhalt[1],Inhalt[2],Inhalt[3]);

Buffer-Overflow - BOOOOOM!

Die sprintf() Funktion führt keinerlei Bereichsüberprüfung aus, ob Du für den Stringpointer, den Du übergibst, überhaupt genügend Speicher reserviert hast.

Sowas sieht doch ein Blinder mit nem Krückstock. (Oder vielleicht einem Brailleschrift Lesegerät für den Code-Editor.)

BTW: Ich habe jetzt nicht Deinen ganzen Quelltext nach Buffer-Overflows abgesucht, sondern nach dem ersten völlig offensichtlichen Buffer-Overflow aufgehört zu suchen.

1.) Arrays als Puffer verwenden damit auch Speicher angelegt wird! Nicht nur blanke Zeiger! 2.) snprintf() verwenden und die Größe des Arrays angeben

Hallo,

ich hätte jetzt hierauf getippt. Hier werden doch größere Arrays in kleinere gequetscht, was einen Bufferüberlauf provoziert. Oder nicht?

//Nachricht aufteilen in einzelne Bausteine Absender[0]=lanpuffer[0]; Absender[1]=lanpuffer[1]; Absender[2]='\0'; Laenge[0]=lanpuffer[2]; Laenge[1]=lanpuffer[3]; Laenge[2]='\0'; Empfaenger[0]=lanpuffer[4]; Empfaenger[1]=lanpuffer[5]; Empfaenger[2]='\0'; Fkt_Code[0]=lanpuffer[6]; Fkt_Code[1]=lanpuffer[7]; Fkt_Code[2]='\0'; Klasse[0]=lanpuffer[8]; Klasse[1]=lanpuffer[9]; Klasse[2]='\0';

was mir noch auffiel ist in der loop. "thisMillis" kannste weglassen.

void loop() { //Timer Ethernet if (millis()-lastMillis>delayMillis) { lastMillis=millis(); wdt_reset(); if (!makeLan()) { Serial.println("keine Verbindung"); alreadyConnected = false; } } }//loop

Nur machst du hier ständig einen Reset aller x Sekunden. Soll das so sein?

Doc_Arduino: Hallo,

ich hätte jetzt hierauf getippt. Hier werden doch größere Arrays in kleinere gequetscht, was einen Bufferüberlauf provoziert. Oder nicht?

was mir noch auffiel ist in der loop. "thisMillis" kannste weglassen. Nur machst du hier ständig einen Reset aller x Sekunden. Soll das so sein?

Ja das letztere Reset hatte ich nur eingebaut um den eigentlichen Fehler erstmal zu umgehen. Aber das mit dem sprintf() klingt ganz zuversichtlich.

Supaaaa... snprintf ist die Lösung. Vielen dank für eure Hilfe.

Daniel

Und dass man für Puffer Arrays nimmt und nicht einfach blanke Zeiger!

char *tempstr="";

Da wird gerade mal 1 Byte reserviert, für den Terminator des leeren Strings