VFP MSComm32 コントロールを使用してバイナリ データを送受信する

この記事では、MSComm32.ocx コントロールを使用して、モデムなしで RS-232 ケーブル経由でバイナリ データを受信および送信する方法について説明します。

元の製品バージョン: Visual FoxPro
元の KB 番号: 154741

概要

この記事では、(モデムを使用せずに) RS-232 ケーブル経由でバイナリ データを受信および送信するための Visual FoxPro 3.0 Communications (MSComm) コントロールを使用する手法について説明します。

詳細

Communications コントロール、MSCOMM32。OCX は、送信バッファーへの文字の文字列のみが許可されているシリアル ポートを介したデータの送受信を許可することで、アプリケーションにシリアル通信を提供します。 この機能では、テキスト ベースのファイルのみを送信することを制限します。

この記事では、MSComm コントロールを使用して、RS-232 ケーブルを使用してバイナリ データを送受信する方法について説明します。 (この記事の手法はモデムでも動作します)。バイナリ データは、一度に 1 バイトずつ文字に変換してから送信する必要があります。 受信したデータは、文字から一度に 1 バイトのバイナリ データに変換する必要があります。

DBCS 対応オペレーティング システム (2 バイト文字セットのいずれかを使用するオペレーティング システム ソフトウェアを実行している) では、バイナリ値の 1 つが DBCS リード文字と一致すると、バイナリ データが破損します。 MSComm コントロールは、このバイトと次のバイトを 1 つの 2 バイト文字として解釈し、同等の ASCII 文字に対して 1 バイトのみを返します。 この問題を解決するには、リード文字を保持するために、1 バイトを 3 文字の ASCII サイズに変換する必要があります。

サンプル コード

次のコードは、このプロセスを示しています。

警告

この記事で提供されているサンプル コードの使用は、お客様ご自身の責任で行ってください。 Microsoft は、明示または黙示を問わず、商品性や特定の目的に対する適合性に関する黙示の保証を含むがこれに限定されない、いかなる種類の保証もなく、このサンプル コードをそのまま提供します。

* Transmitter Code.

* INIT event of Comm OLE control
* 28800 baud, no parity, 8 data, and 1 stop bit.
* In RS-232, maximum speed of 28800 baud can be used

This.Settings = "28800,N,8,1"
This.InputLen = 1
This.CommPort = 1
This.PortOpen = .T.

* ONCOMM event of Comm OLE Control
* The following code is needed to make sure that next set of characters
* can be transmitted (CommEvent = 2 is triggered from the receiver side)

IF This.CommEvent = 2
This.input
IF gnTop <= gnEnd
gcString = FREAD(gnFileHandle, 1) && Store to memory
q=asc(gcstring)
* change ASCII to character (size of 3) to preserve the lead char
thisform.olecontrol1.output = str(q,3)
gnTop = gnTop + 1
ENDIF
ENDIF

* INIT event of form
PUBLIC gnFileHandle
PUBLIC gnEnd
PUBLIC gnTop
PUBLIC q
* You should replace 'c:\sample.hlp' with your own binary file
STORE FOPEN('c:\sample.hlp') TO gnFileHandle && Open the file
STORE FSEEK(gnFileHandle, 0, 2) TO gnEnd && Move pointer to EOF
STORE FSEEK(gnFileHandle, 0) TO gnTop && Move pointer to BOF
gntop=1
q=""
-----------------------
Property of OleControl1

RThreshold = 1 * triggers when at least one char is on the buffer
SThreshold = 3
----------------------

* Receiver Code.

* INIT event of OleControl1
* 28800 baud, no parity, 8 data, and 1 stop bit.

This.Settings = "28800,N,8,1"
This.InputLen = 3
This.CommPort = 1
This.PortOpen = .T.

* OnComm event

IF This.CommEvent = 2 AND This.InBufferCount > 0
qq=CHR(VAL(This.Input))
=FWRITE(gnFileHandle,qq)
this.output = CHR(26)
ENDIF
* INIT event of form
PUBLIC gnFileHandle
* You should replace 'c:\sample.hlp' with your own file name
IF FILE('c:\sample.hlp') && Does file exist?
gnErrFile = FOPEN('c:\sample.hlp',12) && If so, open read-write
ELSE
gnErrFile = FCREATE('c:\sample.hlp') && If not, create it
ENDIF
= FCLOSE(gnErrFile) && Close the file
STORE FOPEN('c:\sample.hlp',1) TO gnFileHandle && Open the file
* CLICK event of button
*This tells the transmitting side to start sending the file
Thisform.Olecontrol1.output = CHR(26)
-----------------------
Property of OleControl1
RThreshold = 3
-----------------------

イベント ドリブン手法では、入力バッファーで待機している文字がある場合に OnComm イベントが生成されます。 また、プロパティには CommEvent 数値 2 が含まれます。 OnComm イベントをトリガーするには、プロパティを 0 以外の Rthreshold 値 (既定値) に設定する必要があります。 プロパティの RThreshold 最も一般的な設定は 1 です。つまり、入力バッファーで少なくとも 1 文字が待機している場合に OnComm イベントがトリガーされます。 この記事では、 度に 3 文字が送信されるため、プロパティの RThreshold 値として 3 が使用されています。