nested while Loops

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
strasshofer
User
Beiträge: 5
Registriert: Freitag 13. März 2020, 17:30

Ich habe eine Frage zu nested while Loops.
Mein Script bekommt per Socket bestimmte Werte. Je nachdem welcher Wert kommt wird eine Led zu blinken gebracht.
Das Problem ist, dass der While Loop (blinken) nicht mehr beendet wird.
Hat wer eine Idee?

Code: Alles auswählen

    while True:
        conn, addr = server.accept()
        print 'accepted connection'            
        while True: 
            data = conn.recv(2)
            if not data:
                break
            while data == "BS":
                boot_start()
            while data == "BE":
                boot_end()
            while data == "AS":
                action_start()
            while data == "AE":
                action_end()
            while data == "HS":
                halt_start()

                
def boot_start():
    GPIO.output(15, GPIO.HIGH)
    time.sleep(0.5)
    GPIO.output(15, GPIO.LOW)
    time.sleep(0.5)
                
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn man nur einen Hammer hat, ist jedes Problem ein Nagel...

Da ist so manches im Argen, aber was dir vor allem weiter hilft: if-Anweisungen. Statt andauernd deine actions (sehr verwirrend benannt: halt_start() - was denn nun?) in einer Schleife zu triggern, pruefst du nur EINMAL ob die Bedingung erfuellt ist, und startest dann nach Bedarf die Aktion. Die zwei auesseren Schleifen sind auch zu einer zusammenfassbar:

Code: Alles auswählen

def main():
    ...
    conn, addr = server.accept()
    while True:
         command = conn.recv(2)
         if command == "BS":
            boot_start()
strasshofer
User
Beiträge: 5
Registriert: Freitag 13. März 2020, 17:30

Ich muss dieses Konstrukt

Code: Alles auswählen

    while True:
        conn, addr = server.accept()
        print 'accepted connection'            
        while True: 
            data = conn.recv(2)
so lassen sonst bekomme ich keine weiteren Werte mehr mit.
Wie schon gesagt, wird eine Bedingung erfüllt dann wird eine weitere Schleife ausgeführt aber aus dieser komm ich nicht mehr raus..

Code: Alles auswählen

while data == "BS":
                boot_start()
                
                
def boot_start():
    while  data == "BS":
        GPIO.output(15, GPIO.HIGH)
        time.sleep(0.5)
        GPIO.output(15, GPIO.LOW)
        time.sleep(0.5)
                
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Weisst du, was

Code: Alles auswählen

while True:
bedeutet? Dann wird auch klar, warum du da nicht rauskommst. Wenn du programmierst, das etwas endlos passieren soll, dann passiert das auch endlos. Und deine Behauptung, due wuerdest die auessere Schleife brauchen, ist technisch Unfug.
strasshofer
User
Beiträge: 5
Registriert: Freitag 13. März 2020, 17:30

Ich will auch nicht aus der äußersten Schleife raus sonder aus der innersten.
Und das wäre

Code: Alles auswählen

while  data == "BS":
        GPIO.output(15, GPIO.HIGH)
        time.sleep(0.5)
        GPIO.output(15, GPIO.LOW)
        time.sleep(0.5)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ja DANN MACH KEINE SCHLEIFE. Dann musst du auch nicht raus aus der.
strasshofer
User
Beiträge: 5
Registriert: Freitag 13. März 2020, 17:30

toller Vorschlag.
Aber die LED's sollen solange blinken bis ein anderer Wert eintrifft
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn man sich bedeckt haelt, was denn eigentlich passieren soll, dann sind die Antworten halt auch nur so lala. Woher sollte man denn wissen, dass da was blinken soll? Hast du ja nicht erwaehnt.

Benutz gpiozero und das hier: https://gpiozero.readthedocs.io/en/stab ... .LED.blink
Benutzeravatar
__blackjack__
User
Beiträge: 14251
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Und wir haben hier wohl auch wieder das übliche Problem bei Socket-Programmieung: ``revc(2)`` heisst *nicht* empfange 2 Bytes sondern empfange 1 bis 2 Bytes. Der Code muss auch damit klar kommen können das wenn beispielsweise "ASAE" gesendet wurde auch bei einem ``recv(2)`` nur "A" kommt und beim nächsten "S" oder gar "SA". Was an dem Code auch komisch ist, ist der Vergleich mit der Zeichenkette "AS" statt den Bytes b"AS", denn `recv()` liefert ja keine Zeichenketten sondern Bytes. Sollte das nicht der Fall sein, verwendet man noch Python 2 → der nächste Fehler.
“All tribal myths are true, for a given value of 'true'.” — Terry Pratchett, The Last Continent
strasshofer
User
Beiträge: 5
Registriert: Freitag 13. März 2020, 17:30

du hast ja so recht aber es funktioniert :-)
und danke __deets__ für den workaround (gpiozero )
hat zwar nicht das innerloop problem gelöst aber mit gpiozero gehts auch
Benutzeravatar
__blackjack__
User
Beiträge: 14251
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@strasshofer: Es funktioniert eben *nicht*. Man kann auch mit geschlossenen Augen über die Autobahn gehen und jedes mal sagen „aber es funktioniert“. Bis es dann eben nicht mehr funktioniert.
“All tribal myths are true, for a given value of 'true'.” — Terry Pratchett, The Last Continent
Antworten