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.dllGeekhideout からダウンロードして \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 件のコメント: