Arduino Serial

OP #3217873
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
OP #3217910
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
Gast #3217953
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.
OP #3217978
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
Gast #3218036
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
OP #3227056
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.
Angehängte Dateien:
Gast #3227077
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.
Gast #3227111
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.
OP #3227553
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.
OP #3229033
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren