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....
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.
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).
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.
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.