2013-07-09 30 views
15

Tôi đang đọc dữ liệu nối tiếp như thế này:PySerial non-blocking đọc loop

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

Vấn đề là nó ngăn chặn bất cứ thứ gì từ thực hiện bao gồm khuôn khổ web chai py. Thêm sleep() sẽ không giúp ích gì.

Thay đổi "trong khi True"" đến 'trong khi ser.readline():' không in 'thử nghiệm', mà là lạ vì nó làm việc trong Python 2.7 Bất kỳ ý tưởng những gì có thể sai

Lý tưởng nhất.? tôi sẽ có thể đọc dữ liệu nối tiếp chỉ khi nó có sẵn dữ liệu đang được gửi đi mỗi 1.000 ms

+3

Bạn sẽ không tạo ra một chủ đề và thêm này đọc mã để nó? –

+1

liên lạc nối tiếp đang chặn ... bạn nên sử dụng chuỗi –

+0

Bạn có thể đăng câu trả lời bằng ví dụ không? – DominicM

Trả lời

28

Đặt nó trong một thread riêng biệt, ví dụ:..

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

Sử dụng một sợi riêng biệt hoàn toàn không cần thiết. Chỉ cần làm điều này cho vòng lặp vô hạn của bạn thay vào đó (Thử nghiệm bằng 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 

Bằng cách này bạn chỉ đọc và in nếu có gì đó ở đó. Bạn nói, "Lý tưởng nhất tôi có thể đọc dữ liệu nối tiếp chỉ khi nó có sẵn." Đây chính xác là những gì đoạn mã trên làm. Nếu không có gì để đọc, nó sẽ bỏ qua phần còn lại của mã của bạn trong vòng lặp while. Hoàn toàn không chặn.

(Câu trả lời này Nguyên văn & sửa lỗi ở đây: Python 3 non-blocking read with pySerial (Cannot get pySerial's "in_waiting" property to work))

pySerial tài liệu: http://pyserial.readthedocs.io/en/latest/pyserial_api.html

+1

Cảm ơn! Giải pháp này đưa tôi ra khỏi một điểm khó khăn ngày hôm nay. Tôi thực sự cảm thấy điều này nên là câu trả lời được chấp nhận trong trường hợp này. –

+2

Thay vì trong khi (True) tôi sẽ đề nghị sử dụng trong khi (ser.isOpen()) – Johnny

+1

cho PySerial Version> 3 bạn cần phải sử dụng ser.is_open – Johnny