Python でプリンターポートを制御する方法、その2
io.dll という、プリンターポートを制御するダイナミックリンクライブラリ、を Python から利用して LPT ポートの各信号を制御します。
もちろん Windows XP です。
Python2.5 の標準 ctypes モジュールを使います。
2.4 以前の Python から使うには win32all を別途インストールして ctypes モジュールを用意します。
io.dll を Geekhideout からダウンロードして \windows\system32 のフォルダにコピーします。
動作確認、とアドレスの確認のために 同じく Geekhideout から parmon.exe をダウンロードして実行します。parmon.exe と以下の Python コードは同時に実行できます。シリアルポートと違って緩いようです。
事前に parmon.exe を実行して、parmon からパラレルポートのアドレスをもらいます、自分の目で読みます。parmon.exe に表示されている 16進数のプリンターポートのアドレスをそのまま利用して動作確認をします。
サンプルのコードは
- ctypes モジュールをインポート
- port にプリンターポートのアドレスを 16進数で設定(0x:ゼロエックス) 378 は parmon で表示された私のPCのプリンターポートのアドレスです。
- data にデータを 16進数で設定(0x) 00 (ゼロゼロ) で D0-D7 を全て Low レベルに
- ctypes の windll で IO.dll の PortOut を使い 2. のport(ポート) に 3.のdata(データ)を出力します。
- 書き込んだ値を表示(10進)
- キー待ち、で一時停止
-------
from ctypes import *
port = 0x378 # in Hex, 0x3BC
data = 0x00 # in Hex, 0xAA 0x55 0xFF
windll.io.PortOut(port,data)
print 'data = ',data
raw_input()
-------
data を適当に AA とか 55 とかにも変えて、parmon.exe で状態が変わるのを見て下さい。
io.dll の使い方(下のほう)に、 C から呼び出すサンプルとか VB から使うサンプルがあります。
PortOut 以外にも PortIn とか色々あって便利です。
真面目に使うには、データタイプをあわせる (argなんとか) とか、あるらしいのですが ctypes は上手にこなしてくれるので任せます。これは Windows だけの特権だそうです。うれしいかぎりです。
データの読み込みを行うと、下位 8bit の上にどこから来たの分からないデータがありますので、ビット演算でマスクすると使いやすいデータになります。こんな方法で本当にいいのか、は分かりません。。。
この方法で、Km2Net さんの USB-IO を バケさんの vbausbio.dll を利用して制御すること、等も出来そうです。買って確かめたら、報告します。
0 件のコメント:
コメントを投稿