パソコン側プログラム

【概要】

パソコンのプリンタインターフェースを使って、ハンドシェイク通信を
行うためのプログラムを説明します。
ここではパラレル通信を制御するため、Dynamic Link Library
(DLL)形式のプログラムを作っています。
そして、その使い方も一緒に説明しています。DLLとして構成されて
いるので、任意のプログラムから起動して使うことが出来ます。

【プログラムの構成】

ハンドシェイク通信のプログラムの流れは、前ページで説明した
PIC側のプログラムの流れと全く同じです。
まず、全体は送信用プログラムと、受信用プログラムに分かれて
います。
またDLLとしては、非常に単純なプログラムとなっています。
DLLを作成するため、Visual C++ Ver4.0を使っています。
DLLの作り方の詳細は、本ページの後半にありますので参考に
して下さい。



【プログラム】

上記構成で作成したプログラムソースと、DLLは、下記となって
います。DLL実行形式プログラムはダウンロードしてお使い下さい。
ソースは、「hndshk.def」と「hndshk.c」の2つから構成されており、
Visual C++ Ver4.0でコンパイルできます。

(1) DLL実行形式プログラム

    ★ ハンドシェイク通信用DLL実行形式プログラム


(2) hndshk.def のソースリスト

;Function Library for HandShake Protocol

LIBRARY "hndshk"
DESCRIPTION 'HandShake Protocol Windows
          Dynamic Link Library'

EXPORTS

InpB
InpW
OutB
OutW
RecvD
SendD


(3) hndshk.c のソースリスト

/*******************************************************
* Handoshake protocol Driver using Parallel Interface.
* This Driver includes below function by Dynamic Link
* Library Program.
*  1. InpB  Input one Byte data from parallel port
*  2. InpW  Input one Word data from parallel port
*  3. OutB  Output one Byte data to parallel port
*  4. OutW  Output one Word data to parallel port
*  5. RecvD  Input data by handshake protocol
*  6. SendD  Output data by handshake protocol
*********************************************************/

#define DllExport _declspec(dllexport)       //DLL宣言
#define ERR -3
#define NOERR 0
#define BUSY -4


//Single Input Function by one byte (InpB)
DllExport unsigned short _stdcall InpB(unsigned short port)
{ return _inp(port);
}

//Single Input Function by one word (InpW)
DllExport unsigned short _stdcall InpW(unsigned short port)
{ return _inpw(port);
}

//Single Output Function by one byte (OutB)
DllExport void _stdcall OutB(unsigned short port, unsigned short databyte)
{ _outp(port, databyte);
}

//Single Output Function by one wrod (OutW)
DllExport void _stdcall OutW(unsigned short port, unsigned short dataword)
{ _outpw(port, dataword);
}

//Input Function by HandShake Protocol (RecvD)
DllExport short _stdcall RecvD(unsigned short port)
{unsigned databyte; unsigned state_busy, i;
  for (i=1;i<1000;i++) {           //ストローブ待ち
    state_busy = _inp(port+1) & 0x80;
    if (state_busy != 0) {
      break;
    }
  }
  if (state_busy == 0){   
    return(ERR);              //タイムアウトエラー
  }
  _outp(port+2,0x21);             //ビジー出力,入力モード
  databyte = _inp(port);           //データ入力
  for (i=0;i<1000;i++) {           //ストローブ解除待ち
    state_busy = _inp(port+1) & 0x80;
    if (state_busy == 0){
      break;
    }
  }
  if (state_busy != 0){
    return(ERR);              //タイムアウトエラー
  }
  _outp(port+2,0);              //ビジー解除、出力モード
  return databyte;              //入力データ返し
}


//Output Function by HandShake Protocol (SendD)
DllExport short _stdcall SendD(unsigned short port, unsigned short databyte)
{unsigned state_busy; unsigned i;
  for (i=0;i<1000;i++) {           //レディー待ち
    state_busy = _inp(port+1) & 0x80;
    if (state_busy == 0){
      break;
    }
  }
  if (state_busy != 0){            //タイムアウトエラー?
    return(BUSY);
  }
  _outp(port, databyte);           //データ出力
  _outp(port+2,1);              //ストローブ出力
  for (i=0;i<1000;i++) {           //ビジー待ち
    state_busy = _inp(port+1) & 0x80;
    if (state_busy != 0){
      break;
    }
  }
  if (state_busy == 0){
    return(ERR);              //タイムアウトエラー
  }
  _outp(port+2,0);              //ストローブ解除
  return(NOERR);
}





DLLプログラムの作り方

【概要】

Windowsで直接入出力を制御するプログラムを作るには、Visual C++
を使って作るのが簡単です。しかし、機能全部をC++で作るのも
大変ですので、Visual BASICでアプリケーション側は作成するのが
楽で、早道です。そこで、ハンドシェイク通信プログラムを、Visual
BASICでも使える様に、Visula C++を使って、Dynamic Link Library
(DLL)形式で作成する方法を説明しています。

【作成手順】

使用しているVisual C++は、Ver4.0で、実際の作成手順は下記順序
で行います。

(1) Visula C++を起動し、ファイル(F)の新規作成(N)を選択する。

(2) 新規作成ダイアログの中で、プロジェクトワークスペースを選ぶ

(3) タイプ(T)でDynamic Link Library を選択する。

(4) プロジェクトワークスペース名(N)に「hndshk」と入力する。

(5) 結果、Visual C++のプロジェクトワークスペースの表示エリアに
  「hndshkクラス」が追加されます。
  そこで、このhndshkクラスを選択してから、メニューバーの挿入(I)
  でプロジェクトファイルを追加(I)を指定します。

(6) ファイル追加のダイアログが表示されるので、ここでファイル名(N)
  で「hndshk.c」と入力し追加を押します。

(7) その後、プロジェクトワークスペース表示エリアにhndshk.cが追加
  されるので、それをダブルクリックすると、ソースエディタが表示
  されるので、そこでソースを入力し、ファイル(F)の上書きで保存
  します。

(8) さらに同じようにして、ファイル追加で、「hndshk.def」を追加し
  ソースリストを入力します。

(9) メニューバーからビルド(B)→プロジェクトの標準設定(F)で、
  hndshk-Win32 Release を選択する。

(10) ビルド(B)のビルド(B)を選択してDLLをコンパイルし作成する。

(11) ビルド中にエラーが発生すれば、エラーメッセージが出るので
   その内容を吟味して修正し再度ビルドを実行します。

(12) この結果、正常にビルドが完了すれば、Debugディレクトリと
  Releaseディレクトリに「hndshk.dll」が作成されます。



DLLプログラムの使い方

【概要】

さてDynamic Link Libraryのプログラムが出来たら、これをどう使えば
良いのでしょうか?

【Visual BASICから使う方法】

まず使い方の例として、Visual BASICから使う方法を説明します。
これは比較的簡単で、BASICの最初でDLL内部関数を宣言する
だけで、使える様になります。

(1) Visual BASIC での関数宣言の仕方
  宣言方法は「Declare文」で行いますが、宣言文の置き場所は
  「標準モジュール」か「(General)-(Declarations)」に置きます。
  ただし、「(General)-(Declarations)」に置くときには、Private指定が
  必要となります。

(2) 宣言文のフォーマット
  Declare文の標準フォーマットに従い、下記のようにします。

  a.戻り値を必要とする場合(Inputの時)

Declare Function 関数名 Lib ”DLL名" (引数 As 型, ・・・) 関数の型

ここで、引数には、直接に値そのものを渡すためにByValで指定します。

(例)

Declare Function InpB Lib "hndshk" (ByVal port As Integer) As Integer

  b.戻り値を必要としない場合(Outputの時)

Declare Sub 関数名 Lib "DLL名" (引数 As 型, ・・・)

ここで引数には、値を直接渡すことが出来るようにByValで指定します。

(例)

Declare Sub OutB Lib "hndshk" (ByVal port As Integer, ByVal databyte As Integer)

  
(3) 実例
  ここではハンドシェイク通信DLLに内蔵している、単純 In/Out関数を
  使った例を紹介します。
  機能は単純に、PC/AT互換機に内蔵のブザーをON/OFFする機能
  のプログラムです。
  その前に、作成した hndshk.dll のプログラムをWindowsのSystemの
  ディレクトリにコピーしておきます。
                      (出典:Try!PC 1997年5月号)
  
  a.Formの構成
   下図のようなFormとし、各ボタンにコードを記述します。



  b.DLL関数宣言文
   下記の宣言文を(General)-(Declarations)に置きます

Private Declare Function InpB Lib "hndshk" (ByVal port As Integer) As Integer
Private Declare Sub OutB Lib "hndshk" (ByVal port As Integer, ByVal databyte As Integer)

  c.Onボタンのコード
   下記のコードを記述追加します。

Private Sub Command1_Click()
Dim ax As Integer
OutB &H43, &HB6
OutB &H42, &H0
OutB &H42, &H8
ax = InpB(&H61) Or &H3
Print Hex(ax)
OutB &H61, ax
End Sub

  d. Offボタンのコード
   下記のコードを記述追加します。

Private Sub Command2_Click()
Dim ax As Integer
ax = InpB(&H61) And &HFC
Print Hex(ax)
OutB &H61, ax
End Sub






    次のページへ       Topページへ