Hallo erst mal bin noch ziemlich neu und wollte mal ein Problem schildern bei dem ich nicht weiterkomme und zwar: Ich sende Daten vom Arduino Mega zum Raspberry Pi der die Daten per Script weiterverarbeitet. So weit so gut geht ja auch nur das nach ner weile der Pi abschmiert weil der Speicher überläuft weil das Script ja jede Minute Gestartet wird und mit cat die daten in ein logfile schreibt nur wird der cat befehl nicht richtig beendet und taucht dann irgendwann zig1000 mal in der prozeslist auf und jedes mal mit 3-4 MB was dazu führt dass der Pi irgendwann aufhört. meine Vermutung war dass es vllt. am onboard Serial-Usb des Arduino liegt und hab dann mal mit nem MAX232 die Verbindung extern bewerkstelligt aber wieder das Gleiche. naja vllt. kennt sich da einer besser aus wie ich im Moment
Verwendest du das Model B mit 512MB RAM? Beim den RPis mit 256MB RAM ist ein Absturz wegen Speicherüberlauf wahrscheinlicher, als bei dem neuen Model B mit 512MB RAM.
ja model B aber so nach 4-5 Tagen lässt er sich nicht mehr Übers Netzwerk ansprechen das Script läuft dann auch nicht mehr aber der Arduino sendet fleißig weiter. Das komische ist nur das über nen 2 Serialport Daten von meiner Heizung Kommen und da wird der cat befehl immer richtig beendet.
1 | #Fröling einlesen |
2 | stty -F $DEVICE sane |
3 | stty -F $DEVICE $DEVICEOPT |
4 | cat $DEVICE ${DEVICEOPT// /,} > $LOGFILE & |
5 | PID1=$! |
6 | |
7 | #Arduino einlesen |
8 | stty -F $DEVICE2 sane |
9 | stty -F $DEVICE2 $DEVICEOPT2 |
10 | cat $DEVICE2 ${DEVICEOPT2// /,} > $LOGFILE2 & |
11 | PID2=$! |
12 | |
13 | #Fröling |
14 | |
15 | until [ $(grep -c '^\$' $LOGFILE) -ge 2 ] ; do |
16 | sleep 1s |
17 | count=$[count+1] |
18 | if [ $count = 20 ] ; then |
19 | echo "no data record found on Fröling ..." |
20 | kill -9 $PID1 |
21 | wait $PID1 |
22 | exit |
23 | fi |
24 | done |
25 | |
26 | #Arduino |
27 | |
28 | count= |
29 | until [ $(grep -c '^\$' $LOGFILE2) -ge 2 ] ; do |
30 | sleep 1s |
31 | count=$[count+1] |
32 | if [ $count = 20 ] ; then |
33 | echo "no data record found on Arduino ..." |
34 | kill -9 $PID2 |
35 | wait $PID2 |
36 | exit |
37 | fi |
38 | done |
39 | |
40 | kill -9 $PID1 |
41 | wait $PID1 |
42 | kill -9 $PID2 |
43 | wait $PID2 |
Cat wird nur beendet wenn EOF erreicht wird. Da Du von einem Device liest, wird wohl kein EOF kommen. Du musst das wohl explizit senden. Da Du cat als Hintergrundprozess startest (wahrscheinlich damit dein Script nicht hängt), sammeln sich natürlich mit der Zeit ganze cat Rudel an bis die Resourcen zu Ende gehen. Lass deinen Arduino mal noch ein EOF am Ende eines Datensatzes senden.
schonmal Danke. Also einfach ein "EOF über Serial oder wie muss ich das verstehen? aber die Heizung sendet doch auch im sekunden Takt die daten ohne dass sie Gefragt wird.
Woran erkennt cat, dass die Datenübertragung beendet ist? Indem ein EOF gesendet wird. Also sendest Du ein EOF. EOF ist meistens identisch mit EOT. EOF = End Of File EOT = End Of Transmission Gugst Du ASCII Tabelle! http://de.wikipedia.org/wiki/End_of_File
Ja ok aber wenn ich jetzt ein EOF einbaue und das Script mit cat erst nach dem halben Datensatz einsteigt gehen mir doch Daten verloren er soll ja die Daten lesen bis 2x das Zeichen $ auftaucht was er ja mit [ $(grep -c '^\$' $LOGFILE2) -ge 2 ] macht und danach erst den Prozess PID2 beenden und da liegt das Problem dass er es nicht macht aber nur beim Arduino bei der Heizung gehts ja auch und die sendet auch kein EOF
Dann analysiere doch mal das Protokoll deiner Heizung und bilde dieses auf dem Arduino nach.
hab ich ja gemacht und es geht ja auch nur das er manchmal den Prozess nicht beendet ganz unregelmäßig das ist ja das kommische. Über SSH kann ich den ja beenden mit der PID und so aber warum das Script das nicht selber macht wie gesagt nicht immer
count würde ich auf ">=" prüfen. Damit ist garantiert, dass if auch garantiert greift. Im Arduino Bereich scheint count nicht richtig zurück gesetzt werden!
1 | #Arduino
|
2 | |
3 | count= |
4 | until [ $(grep -c '^\$' $LOGFILE2) -ge 2 ] ; do |
@ Philipp Hunger: was für einen Fröling hast Du? Ich befasse mich auch schon seit Jahren mit dem Auslesen der Fröling-Kessel.
So sieht es aus da muss es doch eine Lösung geben. Technische Daten dazu sind: der arduino sendet jede Sekunde einen Datensatz un das Script liest mit cat die serielle Schnittstelle und wartet bis 2x "$" auftaucht und müsste dann den Befehl beenden was er nicht tut. Das komische dabei ist das von der anderen Schnittstelle das gleiche gemacht wird und da geht es.
Hast du jetzt mal die count Variable im Arduino Bereich überprüft? Wenn es dumm läuft, dann hat die Variable an dieser Stelle schon den Wert 20 und wird dann um 1 erhöht. Damit wird das if einfach übersprungen, weil dort genau auf 20 geprüft wird! Der kill Befehl wird somit auch nicht ausgeführt.
Im Allgemeinen wird bei unklarer Sachlage eine Plausibilitätskontrolle eingebaut. Serielle Datenübertragung ist nur im ersten Ansatz einfach. Da gibt es die Möglichkeit von Fehlern, die Möglichkeit mitten in einem Paket zu beginnen, unvollständige Pakete und alle nur denkbaren Übertragungsfehler. Noch was: Eine Heizung ist nicht nur in Richtung Schornstein, sondern auch elektrisch eine recht schmutzige Angelegenheit. Da werden Motore gestartet, Ventile geschaltet und Trafos angeworfen. Glaub mir, was auch immer das Bestreben des Herstellers war, ein supersauberes Stromnetz und eine als Zusatz eingebaute, möglicherweise zum Betrieb gar nicht nötige, aber absolut Fehlerfeie serielle Schnittstelle, gehören nicht dazu.
@bash das mit Count greift ja nur wenn keine Daten kommen aber ich versuch trotzdem mal ist aber glaub nicht die Ursache weil die Daten ja verarbeitet werden nur wird die Serielle Schnittstelle vom Arduino nicht richtig geschlossen. @amateur das mit dem "unsauberen Netz is mir klar darum ist ja vorm Arduino und dem Raspberry PI ein Netzfilter mit in der Zuleitung und die Steuerung vom Holzvergaser hat auch nen Netzfilter.
Habs glaub hinbekommen bis jetzt läufts seit ner halben Stunde Stabil ohne dass der prozess mehrfach auftaucht. Änderungen am script:
1 | #Fröling |
2 | |
3 | until [ $(grep -c '^\$' $LOGFILE) -ge 2 ] ; do |
4 | sleep 1s |
5 | count=$[count+1] |
6 | if [ $count = 40 ] ; then |
7 | echo "no data record found on Fröling ..." >> /data/pid2.txt |
8 | kill -9 $PID1 |
9 | wait $PID1 |
10 | kill -9 $PID2 |
11 | wait $PID2 |
12 | exit |
13 | fi |
14 | done |
15 | echo "auslesen Fröling beendet" >> /data/pid2.txt |
16 | |
17 | #Arduino |
18 | |
19 | count= |
20 | until [ $(grep -c '^\$' $LOGFILE2) -ge 2 ] ; do |
21 | sleep 1s |
22 | count=$[count+1] |
23 | if [ $count = 15 ] ; then |
24 | echo "no data record found on Arduino ..." >> /data/pid2.txt |
25 | kill -9 $PID1 |
26 | wait $PID1 |
27 | kill -9 $PID2 |
28 | wait $PID2 |
29 | exit |
30 | fi |
31 | done |
32 | echo "auslesen Arduino beendet" >> /data/pid2.txt |
33 | kill -9 $PID1 |
34 | wait $PID1 |
35 | |
36 | kill -9 $PID2 |
37 | wait $PID2 |
Hab ne Debug ausgabe eingebaut und dadurch draufgekommen das wenn vom Fröling keine Daten Kommen der cat auf dem Arduino gestartet und dann ja nicht richtig beendet wird.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.