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.
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?
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)
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:
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..
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)
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.
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.
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
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
@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