Blockierte While Schleife

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
Benutzeravatar
Robin
User
Beiträge: 50
Registriert: Dienstag 26. Juni 2007, 10:47

Hallo Forum,

meine while-Schleife ist irgendwann blockiert, es wird eine
bestimmte Anzahl von Zeichen eingelesen, aber danach hilft
weder Timeout not break noch finally, das Programm hängt fest

Code: Alles auswählen

try:
  while True:
      rs=ser.read() 
      if not rs: break 
      print rs
finally:
     print 'finally'
Wer kann mir weiterhelfen?

Gruß Robin

moderiert von blackbird: in eigenen Topic abgetrennt, Code Blöcke gesetzt
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Was ist "ser"?
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Hier der Text von Zap, phpBB kann nicht post mergen:
Zap hat geschrieben:Hallo Robin, Willkommen erstmal :)

Ist zwar ne nette Idee sich eines Beitrags eines vorredners anzuschließen aber der Beitrag ist über 4 Jahre alt, da darf man doch schon einen eigenen Thread anlegen ;)

Also wenn deine function so formatiert ist, sollte sie funktinieren.
Ist leider ohne Einrückung schwer zu beurteilen.

Code: Alles auswählen

try: 
    while True: 
        rs=ser.read() 
        if not rs: break
        print rs 
finally: 
    print 'finally'
Edit: Da kam mir ein Admin dazwischen, jetzt bin ich der, der den Beitrag aus der versenkung geholt hat ;)
TUFKAB – the user formerly known as blackbird
Benutzeravatar
Robin
User
Beiträge: 50
Registriert: Dienstag 26. Juni 2007, 10:47

Vielen Dank für die Antwort blackbird,
Der Code ist richtig formatiert, trotzdem läuft es nicht. Das Endezeichen ist unbekannt, der PC, den ich auslese, gibt eine gewisse Anzahl an Zeichen aus und dann hängt alles bei ser.read fest. Jetzt arbeite ich auch mit Exceptions, diese werden aber nicht angesprungen.
Vielleicht ist die Schnittstelle nicht richtig konfiguriert, aber wie kann ich diese vom PC erfragen? Da muss ich wohl durch irgendwie durch ... :-(
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Ich hätte jetzt (einfach mal so) vermutet das ser ein file ist.
Ist dem nicht so? Dann muss ich mich Birkenfeld anschließen
birkenfeld hat geschrieben:Was ist "ser"?
Was meinst du mit PC auslesen ?
vielleicht hängt sich die Geschichte ja garnicht auf und nur der
Wahrheitswert für dein rs tritt niemals ein.
Zähl doch mal die ausgebenen prints mit und zeige die aufm Bildschirm,
vielleicht läuft die Geschichte einfach nur unenedlich
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

ser klingt für mich nach serieller Schnittstelle, aber das ist nur Spekulation...
Benutzeravatar
Robin
User
Beiträge: 50
Registriert: Dienstag 26. Juni 2007, 10:47

Hallo Python-Programmierer,

Ser ist die pySerial (Serielle Schnittstelle von sourceforge.net)
das Auslesen des PCs funktioniert, es kommen Asc-Zeichen rüber, nur
findet die While-Schleife keine END-Bedingung. Ser.inWaiting zeigt
sogar noch eine im Sendepuffer Anzal von Zeichen an, diese werden aber
nicht mehr übertragen, das Programm hängt bei ser.read(). Auch EXCEPTIONS helfen nicht.

Bin verzweifelt :-(
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Robin hat geschrieben:Bin verzweifelt
Hallo Robin!

Nicht verzweifeln. Vielleicht hilft dir dieses Beispiel ein wenig weiter:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import serial
import threading
import time


class SerialReader(threading.Thread):
    
    def __init__(self):
        threading.Thread.__init__(self)
        self.cancel = threading.Event()
    
    
    def run(self):
        
        ser = serial.Serial(port = 3, timeout = 3)
        while not self.cancel.isSet():
            if not ser.isOpen():
                break
            print ser.read() or "<leerdurchlauf>"
        
        print "Thread gestoppt"
    
    
    def stop(self):
        self.cancel.set()



def main():
    
    reader = SerialReader()
    reader.start()
    time.sleep(30)
    reader.stop()
    reader.join()
    
    print "Fertig"


if __name__ == "__main__":
    main()
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Robin
User
Beiträge: 50
Registriert: Dienstag 26. Juni 2007, 10:47

Hallo Gerold,

vielen Dank für Deinen Tipp. Nun hat es sich aufgeklärt. Die Schleife bleibt
bei print hängen und nicht bei ser.read. Der PC sendete nach den Strings eine '0', die brachte den print rs -Befel zum stoppen.
Ich muss jedes einzelne Zeichen erkennen und es dann wenn AscIICode>31 einem String zuordnen.

Vielen Dank für Deinen Tipp, werde es an anderer Stelle gebrauchen können.

Gruß Robin
Antworten