2016-09-13 21 views
1

私はPythonでハードウェアシリアルポートデバイスを使用しようとしていますが、タイミングの問題があります。質問コマンドをデバイスに送信すると、データで応答する必要があります。受信データをあまりにも速く読み取ろうとすると、何も受信しません。Python serial.readline()がブロックされない

import serial 
device = serial.Serial("/dev/ttyUSB0", 9600, timeout=0) 
device.flushInput() 
device.write("command") 
response = device.readline() 
print response 
'' 

readline()コマンドがブロックし、それが必要として新しい行を待っていません。簡単な回避策はありますか?

+1

をしかし、[ドキュメント](のhttp:// pyserial.readthedocs.io/en/latest/shortintro.html#readline) 'write'と' readline'の間の 'flush'呼び出しを示します。また、 'serial'が実際に何であり、どのように設定されているのかを理解することは困難です。誰かが実際に実行して問題を見ることができるより完全なコード例を投稿できますか? –

+0

タイムアウト値はどのように設定されていますか? – paxdiablo

+0

私はこの例を拡張しました。私は 'flush()'を追加しましたが、それは助けになりませんでした。 – Rachie

答えて

0

私はこれを答えとして追加するため、私は賞賛を追加できませんでした。 this stackoverflow threadを参照できます。誰かがあなたの質問に似た何かを試みました。

データの読み込みをループに入れ、データが入っている間にループし続けているようです。このアプローチをとる場合、データの収集を中止してループから飛び降りるのはいつですか?すでに数ミリ秒間何も来ていない場合は、何かが何ミリ秒も入ってこない場合は、データを読み込んで引き続き読み込み、そのデータを取り出して、それを使ってやることができます。

また、のような何かを試すことができます。

While True: 
    serial.flushInput() 
    serial.write(command) 
    incommingBYTES = serial.inWaiting() 
    serial.read(incommingBYTES) 
    #rest of the code down here 
0

readline()あなたはserial.Serial()に渡された同じタイムアウト値を使用しています。 readlineをブロックしたい場合は、timeout引数を削除するだけです。デフォルト値はNoneです。

また、あなたは、デバイスをopeneningのタイムアウトを持つようにしたい場合は、readline()を呼び出す前Noneに設定することができます:それは場合に役立ちます知ってはいけない

import serial 
try: 
    device = serial.Serial("/dev/ttyUSB0", 9600, timeout=0.5) 
except: 
    #Exception handeling 
device.flushInput() 
device.write("command") 
device.timeout=None 
response = device.readline() 
print response 
関連する問題