2008年10月23日木曜日

ここの概要

対象読者
  • Python の「変な使い方」に興味がある方
  • PC による制御・計測・データ解析に興味がある方
  • PCのプログラムを「現実」の世界につなげたい方
  • 何もかも安く済ませたい方
  • 手早く実現したい方
  • ややこしいことが嫌いな方、不精な方
  • とりあえず今だけでも動けばいい、と納得できる方
  • 同業者、友達

問題と基本的対策方法の方針

パソコンを使っての制御や計測、データ解析を行うのですが。一つのことを実現するにも、たくさんの方法があります。いろいろな方法がある中で、私がとる(とりたい)方法は、極力、安く、できるだけ早く、統一された環境で、簡単に開発するです。そこで Python を中心に進めます。くどいようですが Ruby もいいと思います、でも私は、もう Python を始めてしまったので、どうしようもなく困るまで Python です。

安くする為に、LabView、AgilentVee、MatLab、等極力を使わず、でも彼らとのインターフェースを残すぐらい根性無しです。手早くする為に、VBA(Excel)、Cコンパイラ、Java 等を極力使わずに済ませようと思っています。OS も Linux では無く Win32 をベースに進める方針です。

たくさんの言語やシステムを覚えて使いこなす(必要はあるのですが)のを避けたいです。


言い訳


責任を取りたくないので、趣味のブログ、と逃げてます。
知識のレベルが低いので、常識外れの無茶なことをする(してる)かもしれません。
出来るだけ、何も追加で買ったりせず実現する方法を。のつもりですが、つい手元にある有償のモノを使うことがあります。これは手早くの一部なのです。すいません。

Web サイト、Web アプリ の開発とか、文字列や日本語の処理とか、GUI設計、まったく専門外です。
オブジェクト指向プログラミング?とかも、よく意味が分かってません。


ブログを始めた理由

どこのコミュニティーやメイリングリスト等ででも、私のしたいことは 「変」 なので仕方なく。。。自分で。

2008年10月16日木曜日

io.dll で Printer Port の読み込み

前に Python windows で ctypes と io.dll をつかって LPT Port に書き込みましたが、まだデータを読み込んでいませんでしたので、読み込んでみます。環境設定などは、前の記事を見てください。
読み込み自体はうまく行くのですが、表示を期待する形にするのにすこし手間がかかります。

プリンタポートの無い ノートパソコンでは実行しないでください。
プリンターポートのアドレス( 例では0x378)は、parmon.exe などを使って調べて、自分のパソコンのアドレスに合わせてください。
  1. ctypes をインポート
  2. io.dll の IsDriverInstalled という関数の答(1Bit の1か0)をもらって表示します。
  3. プリンターポートに 16進数で 55 の値を io.dll の PortOut 関数で書き込みます。
  4. 自分で書き込んだデータを io.dll の PortIn 関数で読み出します(8ビット)。
自分で「こう表示されるのだろう」と思う値と違う数が表示されるので、ちょっと途惑いますが、落ち着いて考えれば分かりますので、自分が期待する通りの表示になるように対策しましょう。

2.の問題は、1ビットのデータ、「1」の上位が全て 1詰めされて 数値上は -1。
8桁16進表示にすれば FFFFFFFF と 出るかと思うと、そこにも -1。
最下位ビットだけを ビット演算 And で取り出すとやっと思った結果に。

4.の問題は、8ビットだけのデータが欲しいのに上位に不要なデータが入ってるので思わぬ結果に。
16進表示にしても上位にどこから来たのか分からないデータが
16進表示の下二桁だけ表示すればいいかと思いましたが、またおかしい結果に
真面目に8ビットだけ and でマスクしてやっと希望の形になりました。

これは .dll が返す値のフォーマットと Python が受け取る(期待する)フォーマットの食い違いのせいです。本来 argなんとか、で極力合わせて使うべきなのでしょうが、つい(自分にとって)簡単な方向に流れがちで反省しています。将来の課題です。 argなんとか。。。

あぁ、ソースの折り返しがうまく出来てませんね。コピペして見てください。


#
# Win32 (XP)
# Python 2.5
# io.dll c:\windows\system32
#

from ctypes import *


a = 0 # initialize for test
a = windll.io.IsDriverInstalled()
print 'IsDriverInstalled ( decimal ) = ',a
print 'IsDriverInstalled ( 8 digits hex ?) = %(d)08X ' %{'d' :a}
print 'IsDriverInstalled ( 1 digit hex, masked ) = %(d)01X '%{'d' :a & 0x1}


port = 0x378
data_wr = 0x55
windll.io.PortOut(port,data_wr)
print 'PortOut ( 8 digits hex ) = %(d)08X ' %{'d' :data_wr}


data_rd = 0 # initialize for test
data_rd = windll.io.PortIn(port)
print 'PortIn ( decimal ) = ',data_rd
print 'PortIn ( 8 digits hex ) = %(d)08X ' %{'d' :data_rd}
print 'PortIn ( 2 digits hex ?) = %(d)02X ' %{'d' :data_rd}
print 'PortIn ( 2 digits hex, masked ) = %(d)02X '%{'d' :data_rd & 0xFF}