通信制御用ActiveXを使う方法
Visual Basic4.0以降から標準で組み込まれた機能で、OCXコントロールの形式で提供されています。コミュニケーションコントロール(Microsoft
Communication Control 略してMSComm)コンポーネントをフォームに貼り付けるだけで非常に簡単にシリアル通信のプログラミングが出来るため、初心者向きです。詳細については、Visual
Basic Books Online マニュアルを参照してください。
MSCommの機能について
コミュニケーションコントロール(MSComm)は、シリアルポートを利用するための標準的なインターフェイスとなっています。
MSCommを使って行える操作は次のとおりです。
MSCommの通信方法について
コミュニケーション コントロールでは、次の 2 つの方法で通信を行うことができます。
MSCommのプロパティについて
MSCommの主なプロパティについて表1に示します。
プロパティ | 説明 | 設定例 |
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 バイト分ごとに同期をとって行うために使用されます。
項目 | 内容 | 設定値 |
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) コントロールのオブジェクト ライブラリでも参照できます。
定数 | 値 | 説明 |
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) で 予期しないエラーが発生。 |
定数 | 値 | 説明 |
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
と記述します。