2008年9月23日火曜日

Python から ctypes で .dll を使う

ctypes で .dll を使う

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進数のプリンターポートのアドレスをそのまま利用して動作確認をします。

サンプルのコードは
  1. ctypes モジュールをインポート
  2. port にプリンターポートのアドレスを 16進数で設定(0x:ゼロエックス) 378 は parmon で表示された私のPCのプリンターポートのアドレスです。
  3. data にデータを 16進数で設定(0x) 00 (ゼロゼロ) で D0-D7 を全て Low レベルに
  4. ctypes の windll で IO.dll の PortOut を使い 2. のport(ポート) に 3.のdata(データ)を出力します。
  5. 書き込んだ値を表示(10進)
  6. キー待ち、で一時停止

-------

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 件のコメント: