Forum: Mikrocontroller und Digitale Elektronik Arduino Serial


von Philipp H. (hansimglueck2)


Lesenswert?

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

von Raspy (Gast)


Lesenswert?

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.

von bash (Gast)


Lesenswert?

Dann zeig doch mal dein Script!

von Philipp H. (hansimglueck2)


Lesenswert?

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.

von Philipp H. (hansimglueck2)


Lesenswert?

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

von bash (Gast)


Lesenswert?

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.

von Philipp H. (hansimglueck2)


Lesenswert?

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.

von bash (Gast)


Lesenswert?

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

von Philipp H. (hansimglueck2)


Lesenswert?

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

von bash (Gast)


Lesenswert?

Dann analysiere doch mal das Protokoll deiner Heizung und bilde dieses 
auf dem Arduino nach.

von Philipp H. (hansimglueck2)


Lesenswert?

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

von bash (Gast)


Lesenswert?

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

von MitLeser (Gast)


Lesenswert?

@ Philipp Hunger: was für einen Fröling hast Du? Ich befasse mich auch 
schon seit Jahren mit dem Auslesen der Fröling-Kessel.

von Philipp H. (hansimglueck2)


Lesenswert?

hey Einen SP-DUAL mit 40KW

von Philipp H. (hansimglueck2)


Angehängte Dateien:

Lesenswert?

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.

von bash (Gast)


Lesenswert?

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.

von amateur (Gast)


Lesenswert?

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.

von Philipp H. (hansimglueck2)


Lesenswert?

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

von Philipp H. (hansimglueck2)


Lesenswert?

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
Noch kein Account? Hier anmelden.