[PR]テレビ番組表
今夜の番組チェック




通信制御用ActiveXを使う方法


Visual Basic4.0以降から標準で組み込まれた機能で、OCXコントロールの形式で提供されています。コミュニケーションコントロール(Microsoft Communication Control 略してMSComm)コンポーネントをフォームに貼り付けるだけで非常に簡単にシリアル通信のプログラミングが出来るため、初心者向きです。詳細については、Visual Basic Books Online マニュアルを参照してください。

<項目>MSCommの機能について
コミュニケーションコントロール(MSComm)は、シリアルポートを利用するための標準的なインターフェイスとなっています。 MSCommを使って行える操作は次のとおりです。

  1. シリアル ポートへの接続を設定
  2. モデムなどの通信デバイスと接続
  3. コマンドの送出
  4. データの交換
  5. シリアル接続中に発生する可能性がある
    さまざまなイベントおよびエラーを監視し、それらに対処する。



<項目>MSCommの通信方法について
コミュニケーション コントロールでは、次の 2 つの方法で通信を行うことができます。

  1. イベントドリブン(割込み方式)による通信
    シリアル ポートを使用した双方向処理を効果的に行う方法です。たとえば、Carrier Detect (CD) ラインまたは Request To Send (RTS) ラインで、文字を受け取ったり、状態が変化したときなど、イベントが発生した瞬間に通知を受けることが必要な場合があります。コミュニケーション コントロールの OnComm イベントを使うと、これらの通信イベントがトラップされ、そのイベントが発生した時点で必要な処理を行うことができます。OnComm イベントで、通信エラーの検出および処理も行うことができます。発生するイベントおよび通信エラーの一覧については、「CommEvent プロパティ」を参照してください。
     
  2. ポーリング方式による通信
    プログラム内で、主要な関数の実行が終了するたびに CommEvent プロパティの値をチェックして、イベントおよびエラーのポーリングを行う方法もあります。小規模で、単独で動作するアプリケーションでは、この方法が適切な場合があります。たとえば、簡単なダイヤラー プログラムを作成する場合、受信処理の対象となる文字はモデムからのOK という応答だけです。文字を受信するたびにイベントが発生するように設定する必要はありません。



<項目>MSCommのプロパティについて
MSCommの主なプロパティについて表1に示します。

表1.MSCommの主なプロパティ
プロパティ 説明 設定例
CommPort 通信ポート番号を設定または取得する。 1,2,3...16の数値に設定
既定値は1(COM1)
Settings 通信速度、パリティ、データ長、および
ストップ ビット長を文字列で設定または
取得する。 (詳細は、表2参照)
デフォルトは、"9600,n,8,1"
  通信速度=9600bps、
  パリティチェックなし、
  データ長=8ビット、
  ストップビット=1ビット
PortOpen 通信ポートの状態を設定または取得する。
ポートの開閉にも使用する。
True:ポートオープン
False:ポートクローズ
Input 受信バッファから文字列を取得し、
その文字列を受信バッファから削除する。
 
Output 文字列を送信バッファに書き込みます。  
InBufferCount 受信バッファに格納されているバイト数を返す。
このプロパティを使って、受信バッファをクリア
することもできる。
InBufferCountプロパティを 0 に
すると受信バッファをクリアする
OutBufferCount 送信バッファに格納されているバイト数を返す。
このプロパティを使って、送信バッファをクリア
することもできる。
OutBufferCount プロパティを 0 に
すると送信バッファをクリアする
InBufferSize 受信バッファのサイズをバイト単位で
設定または取得する。
既定のサイズは、1,024 バイト
OutBufferSize 送信バッファのサイズを文字列で設定する。
値の取得も可能。
既定のサイズは、512 バイト
InputLen Input プロパティによって受信バッファから
読み取られるバイト数を設定または取得する。
既定値は 0
0 に設定すると、Input プロパティを
使用したときに、受信バッファの内容
全体が読み取られる。
InputMode Input プロパティによって読み取られる
データの種類を設定または取得する。
0−comInputModeText: Input プロパティ
   によって、データがテキストとして読み
   取られる。(既定値)
1−comInputModeBinary: Input プロパティ
   によって、データがバイナリ データとして
   読み取られる。
Handshaking ハードウェア ハンドシェイク プロトコルの設定
または値の取得を行う。
0−comNone :(既定値) ハンドシェイクなし
1−comXOnXOff:XOn/XOff ハンドシェイク
2−comRTS:RTS/CTSハンドシェイク
3−comRTSXOnXOff:RTS/CTS および
          XOn/XOff ハンドシェイク
RTSEnable Request To Send (RTS) ラインを有効にするか
どうかを指定
True:RTS有効
False:RTS無効 (既定値)
SThreshold データ送信時にOnComm イベントを発生させる
しきい値のバイト数を指定
0 (既定値) に設定すると、データ送信イベント
に対して OnComm イベントは発生しない。
Rthreshold データ受信時にOnComm イベントを発生させる
しきい値のバイト数を指定
0 (既定値) に設定すると、文字を受信しても
OnComm イベントは発生しない。
CommEvent 最新の通信イベントまたはエラーを返す
(詳細は、表3,表4を参照)
 



<項目>通信ポートの接続設定について
シリアル ポートは、CommPort プロパティ、PortOpen プロパティ、および Settings プロパティを使って開きます。
例えば、

MSComm1.CommPort = 1
MSComm1.Settings = "9600,N,8,1"
MSComm1.PortOpen = True

CommPort プロパティを使用して、どのシリアル ポートを開くかを指定します。この例では、通信機器が COM1 ポートに接続されているものとして、プロパティの値を 1 (COM1) に設定し、通信機器との接続を行います。CommPort プロパティの既定値は 1 で、1 〜 16 の範囲の任意の数値を設定できます。ただし、アプリケーションが動作するシステムに存在しない COM ポート番号を指定すると、エラーが発生します。
次に、表2に示すSettings プロパティを使用して、通信速度、パリティ、データ長、およびストップ ビットを指定します。指定フォーマットは "BBBB,P,D,S" です。ここで BBBB は通信速度 (bps)、P はパリティ、D はデータ長、S はストップ ビット長です。特に指定しない限り、通信速度は 9600bps に設定されます。パリティは、データの伝送エラーをチェックするために設定します。通常、パリティは使用しないので "N" に設定します。データ長では、何ビットで 1 バイト分のデータを表すかを指定します。ストップ ビットは、データの受信を 1 バイト分ごとに同期をとって行うために使用されます。

表2.Settings プロパティ
項目 内容 設定値
BBBB 通信速度 (bps) 110、300、600、1200、2400
9600 (既定値)、14400、19200
28800、38400、56000、128000
256000
P パリティ E:偶数
M:マーク
N:(既定値) なし
O:奇数
S:スペース
D データ長 4 、5、 6、 7、 8 (既定値)
S ストップ ビット長 1 (既定値)、 1.5、 2

使用するポートおよびデータ通信用パラメータを指定した後、PortOpen プロパティを使って接続を確立します。PortOpen プロパティの値はブール型で、真 (True) または偽 (False) となります。ポートに異常がある場合、CommPort プロパティの設定値が正しくない場合、または使用するシリアル デバイスが、指定されたパラメータ値をサポートしていない場合は、エラーが発生したり、外部デバイスが正常に動作しないことがあります。PortOpen プロパティの値を偽 (False) に設定すると、ポートが閉じられます。シリアル ポートへの接続を確立すると、Output プロパティを使って機器との通信を開始できます。


<項目>バッファに割り当てるメモリサイズの指定について
InBufferSize プロパティにより、受信バッファに割り当てられるメモリサイズを指定できます。特に指定しない限り、受信バッファサイズは、1,024 バイトです。また、OutBufferSize プロパティにより、送信バッファに割り当てられるメモリサイズを指定できます。特に指定しない限り、送信バッファサイズは、512 バイトです。
(注)受信及び送信バッファを大きくすると、アプリケーションで利用できるメモリが少なくなります。一方、バッファが小さすぎると、ハンドシェイクを使用していない場合は、オーバーフローが発生する可能性があります。通常、バッファ サイズは受信 1,024 バイト、送信512 バイトから始めます。オーバーフロー エラーが発生したら、アプリケーションの送信速度に合わせてバッファ サイズを大きくしてください。
なお、InBufferSizeプロパティと InBufferCountプロパティや、OutBufferSizeプロパティとOutBufferCountプロパティとを混同しやすいのでご注意ください。InBufferCount,OutBufferCountプロパティは、その時点で受信,送信バッファに格納されているバイト数を取得するものです。


<項目>データ送信について
Output プロパティを使用して、テキスト文字列、またはバイト配列データを送信できます。
例えば、

' SPECTRUM HomePage というテキスト文字列を送信するとき
    MsComm1.Output = "SPECTRUM HomePage" & vbCr

' バイト配列データを送信するとき
    Dim Out() As Byte    '可変長バイト配列の定義
    MSComm1.Output = Out

テキスト文字列では必要に応じて、伝送データの末尾にはキャリッジ リターン文字 (vbCr) を付加します。
(注)コミュニケーション コントロールでは、2 バイト文字セット (DBCS) のバイナリ データは送受信できません。


<項目>データ受信について
受信バッファからデータを取得するには、Input プロパティを使用します。たとえば、受信バッファからデータを取得して、テキスト ボックスに表示する場合は、次のようなコードを記述します。

TxtDisplay.Text = MSComm1.Input

ただし、受信バッファの内容全体を読み取るには、その前に InputLen プロパティの値を 0 に設定する必要があります。InputLen プロパティの値は、デザイン時または実行時に設定できます。
InputMode プロパティに、Visual Basic 定数の comInputModeText または comInputModeBinary を設定することによって、受信データはテキストまたはバイナリ データの形式で読み取ることができます。データは、テキストの場合は文字列として、バイナリ データの場合はバイト配列として読み取られます。定数 comInputModeText は ANSI 文字セットだけが使用されているデータの場合に設定してください。それ以外の、埋め込み制御文字、null 文字などが含まれているデータの場合は、定数 comInputModeBinary を設定します。
なお、データが 1 バイト受信されるたびに、そのデータは受信バッファに格納され、InBufferCount プロパティの値が 1 増加します。InBufferCount プロパティを使うと、受信バッファに格納されているデータのバイト数を調べることができます。InBufferCount プロパティの値を 0 に設定すると、受信バッファの内容がクリアされます。


<項目>通信エラー/通信イベントについて
通信エラーまたはイベントが発生すると、OnComm イベントが発生します。CommEvent プロパティには、そのエラーまたはイベントを表す数値が設定されます。CommEvent プロパティを参照すると、OnComm イベントが発生する原因になった具体的なエラーまたはイベントを調べることができます。
CommEvent プロパティは、通信エラーまたはイベントを表す表3,表4の定数を返します。これらの定数は、コミュニケーション (MSComm) コントロールのオブジェクト ライブラリでも参照できます。

表3.CommEvent プロパティの通信エラー定数
定数 説明
comEventBreak 1001 中断信号を受信
comEventCTSTO 1002 CTSタイムアウト。
1文字を送信しようとしたが、CTSラインがオフの状態で、
システムで指定された時間が経過した。
comEventDSRTO 1003 DSRタイムアウト。
1文字を送信しようとしたが、DSRラインがオフの状態で、
システムで指定された時間が経過した。
ComEventFrame 1004 フレーム エラー。
ハードウェアによってフレーム エラーを検出。
ComEventOverrun 1006 ポート オーバーラン。
ハードウェアから 1文字が読み取られる前に、次の文字が
受信されたため、その文字が失われた。
ComEventCDTO 1007 CDタイムアウト。
1文字を送信しようとしたが、CDラインがオフの状態で、
システムで指定された時間が経過した。
ComEventRxOver 1008 受信バッファ オーバーフロー。
受信バッファに空き領域がない。
ComEventRxParity 1009 パリティ エラー。
ハードウェアによってパリティ エラーを検出
ComEventTxFull 1010 送信バッファがいっぱい。
1文字をキューに入れようとしたが、
送信バッファがいっぱいになった。
ComEventDCB 1011 ポートのデバイス コントロール ブロック (DCB) で
予期しないエラーが発生。


表4.CommEvent プロパティの通信イベント定数
定数 説明
comEvSend 1 送信バッファ内の文字数が、SThreshold プロパティで
指定された値よりも少なくなった。
ComEvReceive 2 RThreshold プロパティで指定された文字数を受信。
このイベントは、Input プロパティを使って受信バッファから
データを削除するまで、絶えず発生する。
ComEvCTS 3 CTSラインの状態が変化。
comEvDSR 4 DSRラインの状態が変化。このイベントは、DSR が 1 から
0 に変化したときにだけ発生。
comEvCD 5 CDラインの状態が変化。
comEvRing 6 リングが検出。UART (汎用非同期送受信装置) によっては、
このイベントがサポートされない場合がある。
comEvEOF 7 EOF (End Of File) 文字 (ASCII 文字 26) を受信。



<項目>通信ポートの接続解除について
シリアル ポートは、PortOpen プロパティを使って接続を解除できます。
たとえば、

    MSComm1.PortOpen = False

と記述します。


<戻る> <次ページへ>
<TOPページへ>