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