serielle Verbindung hängt sich auf

Hi Leute,

ich kämpfe seit ca einer Woche mit dem Problem das sich die serielle Verbindung zwischen Arduino und meinem Raspberry pi aufhängt...

Ich will die Daten von 2 DHT11 Sensoren über die serielle Verbindung an den raspberry pi schicken und mit Python auswerten und in eine mysql Datenbank schreiben, aber leider hängt sich die Verbindung nach einiger Zeit einfach auf.

Ich hab schon viel darüber gelesen z.B. das es an einem Buffer-Overflow liegen könnte oder an dem automatischen reset vom arduino bei einer Seriellen Verbindung, aber das hat mir auch nicht wirklich weitergeholfen....

Hier mal mein Code:

Arduino: Arduino Code - Pastebin.com

Raspberry-Pi - Python: Python - Pastebin.com

Ich hab auch schon in einer google community um rat gefragt, aber leider konnte mir da auch keiner helfen.

Danke schon mal für die Hilfe

Grüße

wolf360

wolf360:
ich kämpfe seit ca einer Woche mit dem Problem das sich die serielle Verbindung zwischen Arduino und meinem Raspberry pi aufhängt...

Dein Code verwendet String-Objekte anstelle von C-Strings (char arrays).

String-Objekte sind in Arduino fehlerhaft implementiert und führen bei Benutzung zu Fehlern, die das Programm aufhängen.

Manchmal in einer zehntel Sekunde. Und manchmal erst nach 10 Tagen. Kommt ganz drauf an.
In String-Objekten steckt jedenfalls voll der Wurm drin.

Schreibe alle String-Objekte aus Deinem Programm heraus und verwende stattdessen C-Strings (char arrays)!

Das hört sich ganz nach meinem Problem an.

2 tage lief alles ohne Probleme und dann hat es angefangen das er sich immer wieder zufällig aufhängt. ..

Das mit den strings ist ja schon mal gut zu wissen, danke für die schnelle Hilfe =)

wolf360:
Das mit den strings ist ja schon mal gut zu wissen, danke für die schnelle Hilfe =)

Ähem, wobei es sein kann, dass das Arduino-Team das Problem mit den String-Objekten gerade gelöst hat.

Ich habe mir nämlich gerade mal das Update auf 1.0.5 geholt und: Plötzlich funktionieren String-Objekte dauerhaft fehlerfrei! Jedenfalls ergibt das ein kurzer Test von mir.

Keine Ahnung, ob es damit zu tun hat, steht so in den Release-Notes zur 1.0.5:
[avr] malloc bug: backported avr-libc 1.8.0 implementation

Jedenfalls kann ich nun mit der 1.0.5 mit meinem Testcode keine Programmabstürze bei Verwendung von "String" mehr provozieren, die String-Objekte scheinen nun also endlich fehlerfrei zu arbeiten.

Hast Du schon die 1.0.5?

im moment verwende ich Arduino 1.0.1, für debian wheezy gibt es leider noch keine neue Version =(

im moment verwende ich Arduino 1.0.1, für debian wheezy gibt es leider noch keine neue Version

Du musst ja nicht die Distributionsversion benutzen, Du kannst einfach die aktuelle Version downloaden, irgendwo in Deinem Home installieren und von dort aus verwenden. Auf diese Weise kannst Du zur Not auch mehrere Versionen gleichzeitig im Einsatz haben (z.B. wenn Du einen Due verwendest).

Plötzlich funktionieren String-Objekte dauerhaft fehlerfrei!

Der malloc-Bug scheint behoben zu sein. Die String-Klasse hat aber einen inhärenten Bug, der nicht so einfach korrigiert werden kann: Es wird ständig Speicher alloziert und wieder freigegeben. Dadurch wird der Speicher schnell fragmentiert und ist bald so zerstückelt, dass keine genügend grossen Stücke mehr alloziert werden können. Da Arduinos keine MMU (Memory Management Unit) haben, kann auf Hardware-Ebene nicht abgeholfen werden und in Software ist zumindest mit normalen C/C++-Mitteln keine Abhilfe möglich.

Also: schreibe Deinen Sketch um, damit er die String-Klasse nicht mehr benützt, dann hast Du das Problem gelöst und nicht nur verschoben.

jurs:

wolf360:
ich kämpfe seit ca einer Woche mit dem Problem das sich die serielle Verbindung zwischen Arduino und meinem Raspberry pi aufhängt...

Dein Code verwendet String-Objekte anstelle von C-Strings (char arrays).

String-Objekte sind in Arduino fehlerhaft implementiert und führen bei Benutzung zu Fehlern, die das Programm aufhängen.

Manchmal in einer zehntel Sekunde. Und manchmal erst nach 10 Tagen. Kommt ganz drauf an.
In String-Objekten steckt jedenfalls voll der Wurm drin.

Schreibe alle String-Objekte aus Deinem Programm heraus und verwende stattdessen C-Strings (char arrays)!

Mal ne blöde Frage:
Wie schreibe ich C-Strings?

Sowie du arrays schreibst, aber mit chars:

char *p = "String";

oder

char p[] = "String";

buddhafragt:
Mal ne blöde Frage:
Wie schreibe ich C-Strings?

Einen C-String bzw. Char-Array definierst Du einfach als Array of Chars mit der benötigten Länge:

char meinString[40];

(Reservierung von Speicher für einen String mit 39 Zeichen Länge und abschließendes Nullzeichen.)

Die Deklaration funktioniert auch mit Zuweisung als Initialisierung:

char text[21]="Mein Text";

(Reservierung von Speicher für einen String mit 20 Zeichen Länge und abschließendes Nullzeichen, vorbelegt mit einem kürzeren Text.)

char datum[]="Datum:";

(Reservierung in der benötigten Größe für den vorbelegten Text (macht man hauptsächlich bei Text-Konstanten so).

Textkonstanten, die sich zur Programmlaufzeit nicht ändern, können auch im Programmspeicher statt im RAM-Speicher deklariert werden:

char gameover[] PROGMEM="Game Over";

Da Arduinos sehr viel mehr Programmspeicher als RAM-Speicher haben, läßt sich so in textlastigen Programmen mit vielen konstanten Texten eine Menge RAM-Speicher sparen.

Alle Stringfunktionen aus der AVR libc arbeiten nur mit C-Strings:
http://www.nongnu.org/avr-libc/user-manual/modules.html
also insbesondere die Stringfunktionen aus:
http://www.nongnu.org/avr-libc/user-manual/group__avr__string.html
http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html
http://www.nongnu.org/avr-libc/user-manual/group__avr__stdio.html