トップページ⇒prog
12コメント9KB

双方向パラレルポードを制御した〜い

■ このスレッドは過去ログ倉庫に格納されています
0001むっちNGNG
はじめまして。むっちです。
VC++で、conio.hをインクルードして_inpや_outpを使い
PCの双方向パラレルポートを制御するためには、
具体的にどのようなプロトコルに沿ってパラレルポートを
制御すればいいのかわかりません。
パラレルポートのアドレスは、0x378です。
知っている方がいたら教えてください。
読み取りの方法を特に知りたいのです

また、ひょっとしてプロトコルなどはなくポートのアドレスに対して、
いきなり_inpや_outpとか入出力できるんでしょうか?

あと以前「Win32APIのOpenPrinterやReadPrinterも使える」
とかいうのをどこかの掲示板で見かけましたが、そこでは、
「ECPプロトコルに沿ったハンドシェークが必要」
とあったと思います。
ECPプロトコルについてのHPはどこにあるんでしょうか?

小耳に挟んだことで、質問の内容とは直接関係ありませんが
PC-98シリーズの双方向パラレルは、双方向にするための
なにかコマンドが必要らしいです。
0002むっちNGNG
出力する方法だけですが、わかりましたので、
自己レスさせていただきます。

_outp(0x37a@` 0x01);
_outp(0x378@` 0x80);
_outp(0x37a@` 0x00);

とすれば、0x80がポートに出力されるようです。
しかし、0x37aに出力しているのが何を意味するのか
はっきりしません(^^;


また、ポートを使ったあとには、
_outp(0x37a@` 0x01);
_outp(0x378@` 0x00);
_outp(0x37a@` 0x00);

としておくのだそうです。
0003WinでやるならNGNG
I/Oポート直に叩いちゃいかんよ。それとも、ドライバ書くの? DOSで動かすの?
なんとなく、ECP以前にPIOの使い方調べたほうが良いと思う。
それに、双方向で動かすなら、割り込み使わんとまともに動かんと思うが。
0004質問者NGNG
Win32のコンソールアプリです。ドライバじゃないです。
PIOについても調べてみます。

私的にラジコンのプロポ等を制御とモニターをしたいだけなんです。
プロポの変わりにジョイスティック使って(^^;
さらに、ラジコンにCCDとビデオトランスミッター付けて
PC側にはビデオキャプチャーカードつけて...
ほら、なんだか面白そうじゃないですか。(爆
こういった用途に使う予定なんです。
特にストリームデータを転送するわけではなく、
定期的にモニターしたいだけなので割りこみは特に必要ないかと思います。

ところで、
いろいろやってみたら、なんとなく5bit分は読めるようになりました。
普通のパラレルクロスケーブルが5bit分しか繋がっていないのかな?
または、ただやり方が間違っているのかな?、それはちょっと不明です。

一方で出力後、0x379(LPTポートが0x378の時)を
RetVal = _inp(0x379);
とかすれば読めます。ただ、ビットが多少入れ替わってますけど(^^;

そういえば、パラレルポートにスーファミのコントローラー
を繋げて遊ぶというDirectPadというのがあるようですが、
たしか、一個のパラレルポートにつき5台のコントローラーまでしか
使えなかったと思うので、これと関係がありそうです。
関係無かったら、すいません。

では。
0005>4NGNG
コンソールでも基本的に一緒なんだけどなぁ
DOSならVDMがエミュレーションしてくれるはずだからいいけど
それ本当にI/Oポート読めてるの?
本当は、PIOのコントロールレジスタ制御したり、ステータスレジスタ見たりしなきゃいけないんだけど。
Win32アプリなら、特権命令(inp@`outpなど)使った時点でエラーなんだとおもったけど、捨てられてるのかな?
基本的には、デバイスファイル("LPT1"とか)をオープンして
後は、ReadFileとWriteFileでやるのがスジでしょ。
0006IOアクセスNGNG
Win9xは行けます。WinNTはダメです。
0007daiveNGNG
www.vector.co.jpへは、探しに行きましたか?
そのものズバリは、無いけれど、OCXが
WIN32?? I/O制御
とか何とかで、いくつか登録されていたはずです。
00085>6NGNG
あちゃ、そうか、それ、3.1までだと思ってた。
でも、I/Oポートはいじくらないほうが良いと思う。
自分で作ったPIOボードなら別だけど。
0009むっちNGNG
>それ本当にI/Oポート読めてるの?
私の環境ではちゃんと読めています

・読み込み用に使ったパラレルポートは、
Aptiva770というちょっと昔のマシンのマザーにオンボードに
なっているパラレルポートです。アドレスは0x378でした。

・書き込み用のためのパラレルポートは、
Aptiva770にISA非PnPのマルチI/Oカードを増設してやり、
そのポートを使っています。アドレスは、0x278でした。

・さらに二つのポートどうしを、クロスケーブルで繋げてやったんです
・使用したOSは、Win98でした。言い遅れて申し訳ありませんでした

同じマシンのポートで実験しているため、
I/Oを直接叩いた時、ケーブルを伝わったのではなく
ただ他のアドレスに影響を与えて読めたと勘違いしている
かどうかをはっきりさせるため、クロスケーブルが
"あり"と"なし"で実験しましたところ、
"なし"の時、まったく読めませんでした-->ちゃんと読めてる(!?)

私の環境では、何故か運良くうまくいったようですが、
5番さんのおっしゃるとおり、ちゃんと手順をふんでコントロール
していないので、不安要素たっぷりです。(笑

Z80のPIOで8212のようにコントロールワードが必要で無いものもありましたよね?
私の環境では、8212のように気軽に扱うことも可能のようです。
(そもそも、たとえも悪い.....)

7番さんのおしゃられることは、よくわかります。
しかし、I/O制御のコンポーネントを使ったとしても、
パラレルポートの制御は自動で行ってくれないの
ではないでしょうか?そこがちょっとわからないです。

>でも、I/Oポートはいじくらないほうが良いと思う。
8番さん、ご忠告ありがとうございますっ。
CreateFile@`WriteFile@`ReadFile等のAPIを使ったものへ変更しようと思います
方法についてはWin32APIのヘルプを見たら、わかりました。

最後に、あまり関係ないので恐縮ですが、
調べているうちにわかったことを書かせて頂きます。(間違っているかもしれないけど)
0x37aに出力していたものは、どうやらSTBパルスのようです。
プリンタに文字を出力するときは必要っぽいですが、私のような用途に使いたい場合は、
0x378に直接_outpしてもうまくいくようです。(!!環境依存してる可能性大!!)

では!
00105>9NGNG
>CreateFile@`WriteFile@`ReadFile等のAPIを使ったものへ変更しようと思います
それが良いと思います。
たぶん、それなりに、データが流れたのは、既に、Winのドライバか、
BIOSによって、初期化されていたためでしょうね。
I/OポートもPNPで変わっちゃう可能性も有るんで。
0011不良プログラマNGNG
理想的にはドライバーを作るか、OCXを使用した方がよいでしょうが、
その目的ならば、IO直たたきの方が楽だと思います。
PIOのベースアドレスが0x378の場合、
 0x378:データレジスター
 0x379:ステータスレジスター
 0x37A:コントロールレジスター
です。
で、0x379は、
 Bit 0-1 予約
 Bit 2 割り込みステータス
 Bit 3 /ERROR Pin15の入力信号
 Bit 4 SLCT  Pin13の入力信号
 Bit 5 PE   Pin12の入力信号
Bit 6 /ACK  Pin10の入力信号
Bit 7 BUSY  Pin11の入力信号
です。
また、0x378にデータを書けば、Pin2-9にデータが出力されます。
で、外部に繋いだ回路で、そのデータをSTROBEのエッジでラッチを
かけて使います。
0x379は
 Bit0 STROBE
 Bit1 AUTO FEED
Bit2 /INIT
Bit3 SLCT IN
Bit4 割り込み許可
 Bit5 Direction
Bit6-7 予約
です。全部0を書いておけば良いでしょう。
それじゃ、がんばってね。
0012もしかして、NGNG
CreateFileでパラレルポート開くとすると、
リモートマシンのパラレルをアクセス出来るのかな?
■ このスレッドは過去ログ倉庫に格納されています