2013-07-09 18 views
15

PySerialノン・ブロッキング読みループ

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

は、問題は、それがボトルPYのWebフレームワークなどの実行から何かを防ぐことです。 sleep()を追加することは役に立ちません。

変更「「トゥルー中」から 『しばらくser.readline():』それは、Python 2.7で働いていたので、奇妙である、 『テスト』を印刷しない任意のアイデアはどのような間違っている可能性が理想的

。?私はそれが利用可能だ場合にのみ、シリアルデータを読み取ることができなければならないデータは1,000ミリ秒を送られている

+3

はあなたがスレッドを作成し、これを追加しないだろうが、それにコードを読みますか? –

+1

シリアル通信がブロックされています...スレッドを使用する必要があります –

+0

例を使って回答を投稿できますか? – DominicM

答えて

28

例えば、別のスレッドでそれを入れて:。。

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

別スレッドを使用することは全く必要ありません。ループの代わりに(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 

この道を。あなたは、「理想的には、シリアルデータが利用可能になったときにしか読むことができないはずです。これはまさに上記のコードがしていることです。何も読み込めない場合は、whileループのコードの残りの部分にスキップします。完全にノンブロッキングです。

(この答えは、もともとここにデバッグ&投稿:Python 3 non-blocking read with pySerial (Cannot get pySerial's "in_waiting" property to work))を

pySerialドキュメント:http://pyserial.readthedocs.io/en/latest/pyserial_api.html

+1

ありがとう!この解決法は今日私を厳しい場所から救い出しました。私は本当にこれがこの場合に受け入れられる答えであるべきだと感じています。 –

+2

while(true)の代わりにwhile(ser.isOpen())を使用することをお勧めします。 – Johnny

+1

PySerial Version> 3については、ser.is_openを使用する必要があります – Johnny

関連する問題