この記事では、Visual FoxPro で Mscomm32.ocx コントロールを使用してシリアル ポートからデータを受信するために使用する 2 つの方法について説明します。
元の製品バージョン: Visual FoxPro
元の KB 番号: 140525
まとめ
この記事では、Mscomm32.ocx コントロールを使用してシリアル ポートからデータを受信するために使用できる 2 つの手法について説明します。 1 つ目はイベント ドリブン メソッドを使用し、シリアル ポートをポーリングして受信した文字の有無を確認する必要はありません。 この手法により、最も柔軟性が高く、バッファーのオーバーランを防ぐために広範なコーディングは必要ありません。 2 番目の手法では、受信した文字の有無を確認するために、入力バッファーを定期的にポーリングする必要があります。 この記事では、これら 2 つの手法について説明し、それぞれの例を示します。
詳細
使用する手法に関係なく、次のプロパティを設定します。
CommPort
property: この数値プロパティを目的の通信ポートに設定します。 有効な値は、使用可能なシリアル ポートと個々のコンピューターの構成に応じて、1、2、3、または 4 です。 これらの値は、それぞれ Com1、Com2、Com3、および Com4 に対応します。Settings
property: シリアル ポートに接続されているデバイスで必要なボー レート、パリティ、データ ビット、およびストップ ビットに、この文字プロパティを設定します。 このプロパティは、コンマ区切りの文字リストです。 たとえば、シリアル ポートを 14,400 ボー、偶数パリティ、7 データ ビット、および 1 ストップ ビットに設定するには、文字列を14400,E,7,1
に設定します。PortOpen
property: シリアル ポートへの通信を開くには、この論理プロパティを true に設定します。 このプロパティを調べて、ポートが正しく開いているかどうかを確認することもできます。
手法 1: イベント駆動型受信
イベント ドリブン手法では、入力バッファーで待機している文字がある場合に、 OnComm
イベントが生成されます。 また、CommEvent プロパティには数値 2 が含まれます。
OnComm
イベントをトリガーするには、Rthreshold
プロパティを 0 以外の値 (既定値) に設定する必要があります。
Rthreshold
プロパティの最も一般的な設定は 1 です。つまり、少なくとも 1 文字が入力バッファーで待機している場合、OnComm
イベントがトリガーされます。
たとえば、 OnComm
イベントに次のコードを配置して、受信したデータを mybuffer
というフォームのプロパティに追加できます。
Procedure MyCom.OnComm
IF This.CommEvent = 2
ThisForm.mybuffer = ThisForm.mybuffer + This.Input
ENDIF
ENDPROC
方法 2: 入力バッファーのポーリング
入力バッファーをポーリングするには、プログラムが実行していることを定期的に停止し、入力バッファーで待機している文字があるかどうかを確認する必要があります。 この手法を使用する場合は、 Rthreshold
プロパティを 0 (既定値) のままにし、 InBufferCount
プロパティが 0 より大きいかどうかを確認します。これは、バッファー内で待機している文字があることを示します。
注記
Input プロパティの長さを確認するなどの手法を使用すると、Input プロパティにアクセスするとすぐに入力バッファーが空になるため、文字が失われます。 代わりに InBufferCount プロパティを使用してください。
Mscomm コントロールがフォーム上にあり、名前が MyCom
で、 mybuffer
という名前のフォーム プロパティがあると仮定すると、次のコードは待機中の文字をポーリングする方法を示しています。
Procedure myform.myproc
IF Thisform.MyCom.InBufferCount > 0
Thisform.mybuffer = Thisform.mybuffer + Thisform.MyCom.Input
ENDIF
ENDPROC
プロシージャ コードをタイマー メソッドで呼び出して、半一定間隔で文字のチェックを容易にすることができます。 ただし、シリアル ポートから大量のデータを受信することが予想される場合は、Technique One によって入力バッファーが過剰に実行される可能性が低くなります。