おそらく私はあなたの質問を誤解していますが、それはシリアルラインであるため、Arduinoから送信されたすべてのものを順番に読み取る必要があります-読み取るまでArduinoにバッファリングされます.
送信された最新のものを示すステータス表示が必要な場合は、質問にコードを組み込んだスレッドを使用し(スリープを差し引いたもの)、最後の完全な行をArduinoからの最新の行として読み取ったままにします。
更新: mtasic
のサンプル コードは非常に優れていinWaiting()
ますが、が呼び出されたときに Arduino が部分的な行を送信した場合、切り捨てられた行が表示されます。代わりに、最後の完全な行をに入れlast_received
、部分的な行を保持しbuffer
て、次回のループに追加できるようにする必要があります。このようなもの:
def receiving(ser):
global last_received
buffer_string = ''
while True:
buffer_string = buffer_string + ser.read(ser.inWaiting())
if '\n' in buffer_string:
lines = buffer_string.split('\n') # Guaranteed to have at least 2 entries
last_received = lines[-2]
#If the Arduino sends lots of empty lines, you'll lose the
#last filled line, so you could make the above statement conditional
#like so: if lines[-2]: last_received = lines[-2]
buffer_string = lines[-1]
の使用についてreadline()
: Pyserial のドキュメントに記載されている内容は次のとおりです (明確にするために少し編集し、readlines() に言及しています)。
「readline」を使用するときは注意してください。シリアルポートを開くときはタイムアウトを指定してください。そうしないと、改行文字が受信されない場合に永久にブロックされる可能性があります。また、「readlines()」はタイムアウトでのみ機能することに注意してください。タイムアウトがあるかどうかに依存し、それを EOF (ファイルの終わり) として解釈します。
これは私にはかなり理にかなっているように思えます。