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