シリアル データ ストリーム (EOF) の終了を検出する方法がないため、readlineにはタイムアウトを指定する必要があります。
readline
データが送信されていない場合 (またはデータに改行が含まれていない場合) は無期限にブロックされますが、アプリケーションも同様です。のようなものを書くのはまったく問題ありません
def read(ser, queue):
while True:
queue.put(ser.readline())
threading.Thread(target=read, args=(ser, queue)).start()
またはより現代的な同等物
def read(ser, queue):
for line in ser:
queue.put(line)
threading.Thread(target=read, args=(ser, queue)).start()
ただし、読み取りスレッドは決して終了しないことに注意してください。したがって、プログラムが例外的でない方法で終了する場合 (つまり、ユーザーが何らかの方法でプログラムを終了できる場合) は、読み取りスレッドに停止するように通知するメカニズムが必要です。このシグナルが確実に受信されるようにするには、タイムアウトを使用する必要があります。そうしないと、シリアル データがない場合にスレッドが無期限にブロックされる可能性があります。たとえば、これは次のようになります。
def read(ser, queue):
buf = b''
ser.timeout = 1 # 1 second. Modify according to latency requirements
while not should_stop.is_set():
buf += ser.readline()
if buf.endswith('\n'):
queue.put(line)
buf = b''
# else: Interrupted by timeout
should_stop = threading.Event()
threading.Thread(target=read, args=(ser, queue)).start()
# ... somewhat later
should_stop.set() # Reading thread will exit within the next second