続々デジタルマルチメーターの出力を取り出す

以下の続き。
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 V

real 0m2.486s
user 0m0.020s
sys 0m0.000s