2013-07-09 9 views
15

I serielle Daten wie diese lesen:pyserial nicht blockierende Leseschleife

connected = False 
port = 'COM4' 
baud = 9600 

ser = serial.Serial(port, baud, timeout=0) 

while not connected: 
    #serin = ser.read() 
    connected = True 

    while True: 
     print("test") 
     reading = ser.readline().decode() 

Das Problem ist, dass es etwas anderes von der Ausführung einschließlich Flasche py Web-Framework verhindert. Hinzufügen von sleep() wird nicht helfen.

ändern „während True““bis‚während ser.readline():‘druckt nicht‚test‘, die, da sie in Python 2.7 gearbeitet seltsam Irgendwelche Ideen, was falsch sein könnte

Idealer.? ich soll nur serielle Daten lesen kann, wenn es verfügbar ist Daten alle 1.000 ms gesendet werden

+3

Möchten Sie nicht einen Thread erstellen und fügen Sie diesen Code, um es lesen? –

+1

serielle Kommunikation blockiert ... Sie sollten einen Thread verwenden –

+0

Konnten Sie eine Antwort mit einem Beispiel veröffentlichen? – DominicM

Antwort

28

Legen sie es in einem separaten Thread, zum Beispiel:..

import threading 
import serial 

connected = False 
port = 'COM4' 
baud = 9600 

serial_port = serial.Serial(port, baud, timeout=0) 

def handle_data(data): 
    print(data) 

def read_from_port(ser): 
    while not connected: 
     #serin = ser.read() 
     connected = True 

     while True: 
      print("test") 
      reading = ser.readline().decode() 
      handle_data(reading) 

thread = threading.Thread(target=read_from_port, args=(serial_port,)) 
thread.start() 

http://docs.python.org/3/library/threading

21

Die Verwendung eines separaten Threads ist völlig unnötig. stattdessen nur tun dies für Ihre unendliche while-Schleife (getestet in Python 3.2.3):

while (True): 
    if (ser.inWaiting()>0): #if incoming bytes are waiting to be read from the serial input buffer 
     data_str = ser.read(ser.inWaiting()).decode('ascii') #read the bytes and convert from binary array to ASCII 
     print(data_str, end='') #print the incoming string without putting a new-line ('\n') automatically after every print() 
    #Put the rest of your code you want here 

diese Weise können Sie nur lesen und drucken, wenn etwas da ist. Sie sagten: "Idealerweise sollte ich serielle Daten nur dann lesen können, wenn sie verfügbar sind." Dies ist genau das, was der Code oben tut. Wenn nichts zu lesen ist, springt es in der while-Schleife zum Rest des Codes. Völlig nicht blockierend.

(Diese Antwort Zitat & hier debuggt: Python 3 non-blocking read with pySerial (Cannot get pySerial's "in_waiting" property to work))

pyserial Dokumentation: http://pyserial.readthedocs.io/en/latest/pyserial_api.html

+1

Danke! Diese Lösung hat mich heute aus der Patsche gebracht. Ich denke, das sollte die akzeptierte Antwort in diesem Fall sein. –

+2

Anstelle von while (True) würde ich vorschlagen, while (ser.isOpen()) – Johnny

+1

für PySerial Version> 3 zu verwenden, müssen Sie ser.is_open verwenden – Johnny