Windowsでpyserial

2.5のインストーラーを落とす。
http://www.python.jp/pub/ftp.python.org/python/2.5/python-2.5.msi
msi形式なので、普通にインストールする。C\python25に入った。
んで、これはどうやって使うのかな?
だいぶ前に使ったけど、すっかり忘却。
アプリケーションメニューからIDLEを起動してみる。
IDLE1.2が起動した。
ふーん、普通にpythonのシェル環境だ。


https://sourceforge.net/projects/pywin32/
http://jaist.dl.sourceforge.net/sourceforge/pywin32/pywin32-210.win32-py2.5.exe
2.5対応のものを落とす。
これもWinインストーラーで楽。


http://pyserial.sourceforge.net/
http://sourceforge.net/project/showfiles.php?group_id=46487
http://downloads.sourceforge.net/pyserial/pyserial-2.2.win32.exe?use_mirror=jaist
http://jaist.dl.sourceforge.net/sourceforge/pyserial/pyserial-2.2.win32.exe
こいつもWinインストーラーがあるから楽。


ターゲットデバイスを挿す。
バイスマネージャで見ると、COM12とかになっている。
COM9までしかアクセスできない制限とかなかったっけ?
これはCOMで指定するデバイス名指定の制限で、デバイス番号でなら問題ないらしい。
IDLEで試す。

IDLE 1.2      
>>> import serial

>>> com = serial.Serial(
  port=11,
  baudrate=115200,
  bytesize=8,
  parity='N',
  stopbits=1,
  timeout=None,
  xonxoff=0,
  rtscts=0,
  writeTimeout=None,
  dsrdtr=None)
>>> print com.portstr
\\.\COM12

ハンドリングできているようだ。

>>> com.write("@HELLO")

では、どうも送信されていない風だ。応答が返らない。何が悪いのかな?

>>> print >>com, '@HELLO'

こっちなら大丈夫。
readlineするときには、timeoutがないと応答が返らない。

>>> com.timeout=0.5
>>> print >>com, '@HELLO'
>>> print com.readline()
@ACK□


>>> print >>com, '%\
00000000000000000000000000F8F898\
98F8F00000E0F838F8E00000F8F800F8\
F81818F8F000F8F80000F8F800F8F860\
606C600C00E0E000F8F8000000000000\
000000000000000000001F1F01031F1D\
001E1F0706071F1E001F1F001F1F1818\
1F0F00000010180F07000F1F18181818\
00080F07001F1F080600000000000000\
0000000000FFFEFEFEFEFEFEFEFEFEFF\
FEFEFEFEFEFEFEFEFEFFFEFEFEFEFEFE\
FEFEFEFFFEFEFEFEFEFEFEFEFEFFFEFE\
FEFEFEFEFEFEFE000000000000000000\
00001F1F1F1F1F1F1F1F1F1F1F1F1F1F\
1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F\
1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F\
1F1F1F1FF8F8C08C000C00383848484C\
4C4868381800080848C8A83818000000\
F8F80000000000000000000000000000\
00000000000000000000000000000000\
001F1F000103020011190F07010F1F11\
11090008181010111F0E0000001B1B00\
00000000000000000000000000000000\
0000000000000000000000000000FFFE\
FEFEFEFEFEFEFEFEFFFEFEFEFEFEFEFE\
FEFEFFFEFEFEFEFEFEFEFEFEFFFEFEFE\
FEFEFEFEFEFEFFFEFEFEFEFEFEFEFEFE\
FF000000000000000000001F1F1F1F1F\
1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F\
1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F\
1F1F1F1F1F1F1F1F1F1F1F1F1F1F0000\
0000000000000000'
>>> print com.readline()
@ACK□

画像の送信も問題なし。

>>> print >>com, '@LED,1,BLINK'
>>> print com.readline()
@ACK□


>>> print >>com, '@LED,1,FAST'
>>> print com.readline()
@ACK□


>>> print >>com, '@LED,1,OFF'
>>> print com.readline()
@ACK□


>>> print >>com, '@LED,1,ON'
>>> print com.readline()
@ACK□

LEDの制御もできる。

>>> print com.readline()
@SW,1□


>>> print com.readline()
@SW,2□

ボタンの結果も取れている。

>>> com.close()

閉じて終わり。
当たり前だけど、普通に使えるな。


書く前に念のためにcom.flush()しといたほうがいいかな。


サービスにする場合には、デバイスが接続されたCOMポート番号が取れないのがめんどくさいな。
tryで順番に開いて見て、開けたのはHELLOして返信チェックするのは乱暴かな?