Seite 1 von 1

nested while Loops

Verfasst: Freitag 13. März 2020, 17:41
von strasshofer
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)
                

Re: nested while Loops

Verfasst: Freitag 13. März 2020, 18:10
von __deets__
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()

Re: nested while Loops

Verfasst: Freitag 13. März 2020, 19:06
von strasshofer
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)
                

Re: nested while Loops

Verfasst: Freitag 13. März 2020, 19:11
von __deets__
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.

Re: nested while Loops

Verfasst: Freitag 13. März 2020, 19:14
von strasshofer
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)

Re: nested while Loops

Verfasst: Freitag 13. März 2020, 19:14
von __deets__
Ja DANN MACH KEINE SCHLEIFE. Dann musst du auch nicht raus aus der.

Re: nested while Loops

Verfasst: Freitag 13. März 2020, 19:17
von strasshofer
toller Vorschlag.
Aber die LED's sollen solange blinken bis ein anderer Wert eintrifft

Re: nested while Loops

Verfasst: Freitag 13. März 2020, 19:20
von __deets__
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

Re: nested while Loops

Verfasst: Freitag 13. März 2020, 21:15
von __blackjack__
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.

Re: nested while Loops

Verfasst: Freitag 13. März 2020, 21:19
von strasshofer
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

Re: nested while Loops

Verfasst: Freitag 13. März 2020, 21:44
von __blackjack__
@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.