シリアルポートからデータを読み込んでいます。データは 9 文字でパックされます。構造体は必要ありません。形式はわかっていますが、2 つの問題があります。1) ポートを開いたままにしておくと、イベントの 1 ~ 3 秒後に答えが返されます (リアルタイムで表示できる LED パネルがあります)。シリアルにある必要があるイベントと値)。いっぱいになったときにのみフラッシュするバッファに関連していると思います(そして、私は非管理者としてWin32で作業することを余儀なくされているため、それをあまり制御できません)。読み取りは定期的 (200 ミリ秒) に実行されるため、開閉はリソースの無駄のように見えます。ポートを開いたままにして、読み取る前にバッファを強制的にフラッシュする方法はありますか?(Pythonから!)
2) 値を取得するには、構造体の末尾にあるマーカー (13) を見つけ、それに応じて (次の 8 文字または前の 8 文字) 読み取る必要があります。ループは最も効率的な Python の部分ではないので、インデックスを取得し、すべてをブロックせずにデータを読み取る方法ですか? (ノンブロッキングソリューションとして他のスレッドにある場合でも、連続読み取りはプロセッサを稼働させます)。使用する場合:
class SeReader(object):
def __init__(self, tata):
self.ser = serial.Serial()
self.ser.baudrate = 2400
self.ser.port = "COM1"
self.tata = tata # entry point for main gui notification
self.val, self.status, self.semn, self.data, self.oldVal = None, None, None, None, None
self.is_stable, self.on = False, False
self.stable_count = 0
self.on = False
def read(self):
if not self.on: return False
self.ser.open()
data = self.ser.read(18)
self.ser.close()
start = -1
for x in xrange(18):
if data[x] == '\r':
start = x + 1
break
if start == -1:return True
self.data = val = data[start:start + 9]
try:
self.status = val[0]
self.val = val[2:8]
self.semn = val[1]
self.tata.write_data(self.semn, self.val)
except Exception as e:
self.tata.set_cs_unstable()
self.tata.write_data("> ", "Eroare")
print(self.val, e)
if self.val == self.oldVal:
self.stable_count += 1
else:
self.oldVal = self.val
self.stable_count = 0
if self.stable_count > 8:self.tata.set_cs_stable()
else:self.tata.set_cs_unstable()
return True
self.tata などは、メイン GUI に通知するためのものです。