PySerialモジュールを介してシリアルポートからデータを読み取るPythonプログラムがあります。覚えておく必要のある2つの条件は、次のとおりです。到着するデータの量がわからないことと、データをいつ期待するかわからないことです。
これに基づいて、次のコードスニペットを考え出しました。
#Code from main loop, spawning thread and waiting for data
s = serial.Serial(5, timeout=5) # Open COM5, 5 second timeout
s.baudrate = 19200
#Code from thread reading serial data
while 1:
tdata = s.read(500) # Read 500 characters or 5 seconds
if(tdata.__len__() > 0): #If we got data
if(self.flag_got_data is 0): #If it's the first data we recieved, store it
self.data = tdata
else: #if it's not the first, append the data
self.data += tdata
self.flag_got_data = 1
したがって、このコードは永久ループになり、シリアルポートからデータを取得します。最大500文字でデータを保存し、フラグを設定してメインループに警告します。データが存在しない場合は、スリープ状態に戻って待機します。
コードは機能していますが、5秒のタイムアウトが気に入らないのです。どれだけのデータが期待できるかわからないので必要ですが、データがない場合でも5秒ごとにウェイクアップするのは好きではありません。
実行する前に、データがいつ利用可能になるかを確認する方法はありますread
か?select
Linuxのコマンドのようなものを考えています。
注:私はこの方法を見つけましたinWaiting()
が、実際には「睡眠」を投票に変更するだけのようです。そのため、ここではそれを望んでいません。データが入るまで寝て、それを手に入れたいだけです。