Seite 1 von 1

Blockierte While Schleife

Verfasst: Dienstag 26. Juni 2007, 11:16
von Robin
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

Verfasst: Dienstag 26. Juni 2007, 11:37
von birkenfeld
Was ist "ser"?

Verfasst: Dienstag 26. Juni 2007, 12:04
von mitsuhiko
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 ;)

Verfasst: Dienstag 26. Juni 2007, 13:53
von Robin
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 ... :-(

Verfasst: Dienstag 26. Juni 2007, 14:06
von Zap
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

Verfasst: Dienstag 26. Juni 2007, 14:23
von mkesper
ser klingt für mich nach serieller Schnittstelle, aber das ist nur Spekulation...

Ser ist die pySerial (Serielle Schnittstelle)

Verfasst: Donnerstag 28. Juni 2007, 08:00
von Robin
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 :-(

Re: Ser ist die pySerial (Serielle Schnittstelle)

Verfasst: Donnerstag 28. Juni 2007, 08:35
von gerold
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
:-)

Verfasst: Donnerstag 28. Juni 2007, 09:10
von Robin
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