続々デジタルマルチメーターの出力を取り出す
以下の続き。
http://d.hatena.ne.jp/kinneko/20130123/p1
http://d.hatena.ne.jp/kinneko/20130128/p1
テスタからの応答に5秒かかる問題は、テスタ側からの改行コードが0Dで、readlinesしたときにタイムアウトするまで待っているようだ。
だから5秒かかっているのね。
0Aが期待しているデータの末尾なのかな。
しかし、LFしか送ってこないとか、Macのような実装だな... orz
最初、必ずゴミが入るのも、この問題か?
pyserialでは行末はよしなにしてくれないというのもアレ。
実のこと、もう作業終わったからどうでもいいんだけどな...
http://pyserial.sourceforge.net/shortintro.html#readline
EOLのコードを指定するには、io.TextIOWrapperを使う必要があるようだ。
めんどくさ〜。
こんな感じ?
実機もう手元にないから試してないけど。
#!/usr/bin/python import serial import io class MAS345(object): def __init__(self, port="/dev/ttyUSB0"): self.port = port self.com=serial.Serial( port, 600, bytesize=7, parity="N", stopbits=1, timeout=5, xonxoff=0, rtscts=0, dsrdtr=None ) self.com.setRTS(0) self.com.setDTR(1) def _read_raw_value(self): self.sio = io.TextIOWrapper(io.BufferedRWPair(self.com, self.com)) self.sio.flush() self.sio.write("\n") data = self.sio.readline() return data if __name__=="__main__": output = MAS345() print output._read_raw_value()
送ってくるのは、固定長で14byteだったっけ?
それだけ読んで後flashしたほうが合理的かも。
ただ、タイムアウト短くするというのもありかな。
テスタ来たのでやってみた。
まだ使うんだってさ。
実行。
TypeError: must be unicode, not str
あいたた。
書き直し。
self.sio.write(unicode("\n"))
妙に遅いのと、ゴミしか来ないわ。
kinneko@BuildSV:~$ time ./test.py
real 0m12.065s
user 0m0.030s
sys 0m0.000s
data = self.sio.readline() data2 = self.sio.readline() return data2
kinneko@BuildSV:~$ time ./test.py
real 0m17.065s
user 0m0.030s
sys 0m0.000s
何も拾えませんな。
効いてないってことか。
前に戻して時間を見る。
kinneko@BuildSV:~$ time ./test.py
TE 0027 C real 0m7.495s
user 0m0.010s
sys 0m0.010s
timeout=1にして時間を見る。
kinneko@BuildSV:~$ time ./test.py
TE 0027 C real 0m3.525s
user 0m0.020s
sys 0m0.000s
確かに4秒短くなっている。
頭のゴミはなんだろうねぇ。
self.com.flush() self.com.write(unicode("\n")) data = self.com.readlines() return data self.com.flush()
kinneko@BuildSV:~$ time ./test.py
['|TE 0027 C\r']real 0m4.525s
user 0m0.020s
sys 0m0.000s
確かに\rが見える。
頭にゴミも入っている。
しょうがない、readでやるか。
こんな感じでゴミも掃除。
def _read_raw_value(self): self.com.flush() self.com.write(unicode("\n")) data = "" for var in range(14): if var == 0: self.com.read() continue data += self.com.read() return data self.com.flush()
kinneko@BuildSV:~$ time ./test.py
DC -0.000 Vreal 0m2.486s
user 0m0.020s
sys 0m0.000s