Forum: Mikrocontroller und Digitale Elektronik skript restart


von okey (Gast)


Lesenswert?

Guten Morgen zusammen, ich habe hier eine Simulation eines Programms, 
der Daten aus einer Sensor bekommt und über mqtt publisht

zwar wird gepublischt aber in der while-Schleife success kommt es 
anscheinend zu Problemen.
1
counter = 0
2
while True:
3
    count = count + 1
4
    counter += 1
5
    if count > 0:
6
        print('Literverbrauch:',count)
7
        if counter > 5:
8
            sys.exit()      ----->       # hier habe ich einen Fehler 
9
        success = True                   # provoziert und möchte alternativ
10
        errorCounter = 0                 # für sys.exit den Skript neu 
11
        while success:                   # starten, um daten neu zu bekommen. 
12
            try:
13
                client.publish('testclient', str(count), qos=1)
14
                success = False
15
                sleep(0.5)
16
                errorCounter += 1
17
                if errorCounter > 10: 
18
                    sys.exit()

von Stefan F. (Gast)


Lesenswert?

okey schrieb:
> aber in der while-Schleife success kommt es
> anscheinend zu Problemen.

Welche Probleme, und was scheint (was hast du gesehen)?

Ich sehe da folgende Unlogik: In der "while success" Schleife setzt du 
schon beim ersten Durchlauf success=False, deswegen wird sie nur einmal 
durchlaufen. Innerhalb der Schleife erhöhst du aber den errorcounter um 
bei >10 auszusteigen. So weit kommt der Counter aber nie, weil die 
Schleife ja nur einmal durchlaufen wird.

von okey (Gast)


Lesenswert?

Stefan F. schrieb:
> okey schrieb:
>> aber in der while-Schleife success kommt es
>> anscheinend zu Problemen.
>
> Welche Probleme, und was scheint (was hast du gesehen)?

ich bekomme in den mqtt pycharm skript keine Daten mehr.. dafür muss ich 
den Kabel von den esp8266 unplugen und wieder plugen damit es neu 
gestartet wird.. was ja keine optimale Lösung ist..

von Stefan F. (Gast)


Lesenswert?

okey schrieb:
> ich bekomme in den mqtt pycharm skript keine Daten mehr.. dafür muss ich
> den Kabel von den esp8266 unplugen und wieder plugen damit es neu
> gestartet wird.. was ja keine optimale Lösung ist..

Naja, wenn du dein Script mit sys.exit() beendest, dann ist es beendet. 
Ich frage mich, warum du etwas anderes erwartet hast.

Wenn das Script weiter laufen soll, dann musst du das auch so 
programmieren. Auf Mikrocontrollern ist es üblich, dass das 
Hauptprogramm aus einer Endlosschleife ohne Abbruch besteht.

Noch was: Wenn du das Programm schon 0,5s nach dem Absetzen einer 
Message abbrichst, dann kann es ganz gut sein, dass die Message bis 
dahin noch nicht gesendet wurde. Du musst schon warten, bis der 
Sende-Puffer leer ist. Leider hat der MQTTClient keine entsprechende 
Funktion, mit der man den Puffer kontrollieren kann.

Eventuell hilft es, vor dem exit die disconnect() Funktion vom 
MQTTClient aufzurufen. Ich habe im Quelltext gesehen, dass dadurch der 
darunter liegende Socket geschlossen wird.

von okey (Gast)


Lesenswert?

an sich sieht mein Programm so aus, die Counter schleife und 
errorcounter war nur zum Testen, bzw einen Fehler provozieren und 
gucken, was bei sys.exit() so passiert,



ich möchte den Skript dauerthaft laufen lassen, und neu starten, wenn es 
zu Problemen mit Wlan verbindung oder MQTT-Broker gibt.

1
while True:
2
    count = pulse2liter(trigger_pin) 
3
    countall = count + countall
4
    #count = count + 1
5
    if count > 0:
6
        print('Literverbrauch:',countall)
7
        success = True
8
        while success:
9
            try:
10
                client.publish('testclient', str(count), qos=1)
11
                success = False
12
                sleep(0.5)   --->  # und genau hier scheint der Programm iwann zu 
13
            except Exception as e:       # crashen, also sys.exit() war mein erster  
14
                print(e) # rote LED an   # Gedanke, aber da springt der raus und hört  
15
        #rote LED aus                    # halt auf, also ich brauche eine Alternative
16
        #sleep(0.1)                      # damit ich den Skript automatisch neu 
17
    sleep(0.1)                           # starte, wenn der crasht.

von Stefan F. (Gast)


Lesenswert?

Ich denke nicht, dass sys.exit() auf einem Mikrocontroller Sinn ergibt. 
Benutze das einfach nicht. Überlege dir was anderes wie du dein Programm 
neu startest. Man Kann Schleifen auch mit break verlassen, bzw. mit 
continue zurück an den Anfang springen.

Zur Not kann man auch den eventuell vorhandenen Watchdog triggern, damit 
der einen Hardware-Reset auslöst.

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.