2013-07-09 17 views
15

:pyserial engellenmeyen Böyle seri veri okuyorum okuma döngü

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() 

sorun şişe py web çerçeve dahil yürütülmesini başka bir şey önlemesidir. sleep() eklenmesi size yardımcı olmaz.

değiştirme " "Doğru ise" dan 'ise ser.readline():' Bu Python 2.7 çalışmış beri tuhaf olan 'test' yazdırmıyor Herhangi bir fikir neyi yanlış olabilir İdeal

.? Ben Sunulursa yalnızca seri veri okumak mümkün olmalıdır Veri her 1000 ms gönderiliyor

+3

bir iş parçacığı oluşturmak ve bu ona kodunu okumak eklemek olmaz mı? –

+1

seri haberleşme engelleniyor ... bir iş parçacığı kullanmalısınız –

+0

Örnek bir cevap gönderebilir misiniz? – DominicM

cevap

28

örneğin ayrı bir iş parçacığı koy.:.

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

Ayrı bir iplik kullanmak tamamen gereksizdir. döngü yerine (Python 3.2.3 test edilmiştir) iken Sadece sonsuzun için bunu: Yalnızca okuma ve baskı

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 

Bu şekilde bir şey varsa. "İdeal olarak sadece mevcut olduğunda seri veriyi okuyabiliyordum" dedin. Yukarıdaki kodun tam olarak budur. Okunacak bir şey yoksa, while döngüsündeki kodunuzun geri kalanına atlar. Tamamen engelleme.

(Bu cevap aslen & burada debug Gönderildiği: Python 3 non-blocking read with pySerial (Cannot get pySerial's "in_waiting" property to work))

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

+1

Teşekkürler! Bu çözüm beni bugün zor bir noktadan kurtardı. Bu durumda kabul edilen cevap olması gerektiğini düşünüyorum. –

+2

Yerine (True) PySerial Sürümü> 3 için (ser.isOpen()) – Johnny

+1

kullanırken kullanmanızı tavsiye ederim. Ser.is_open – Johnny