Freigeben über


Übertragen und Empfangen von Binärdaten mithilfe des VFP MSComm32-Steuerelements

In diesem Artikel wird beschrieben, wie Sie das MSComm32.ocx-Steuerelement verwenden, um binäre Daten über ein RS-232-Kabel ohne Modems zu empfangen und zu übertragen.

Originalproduktversion: Visual FoxPro
Ursprüngliche KB-Nummer: 154741

Übersicht

In diesem Artikel werden einige Techniken veranschaulicht, die das Visual FoxPro 3.0 Communications (MSComm)-Steuerelement zum Empfangen und Übertragen von Binären Daten über das RS-232-Kabel (ohne Modems) verwenden.

Weitere Informationen

Das Kommunikationssteuerelement MSCOMM32. OCX bietet serielle Kommunikation für Ihre Anwendung, indem die Übertragung und der Empfang von Daten über einen seriellen Port ermöglicht wird, bei dem nur eine Zeichenfolge an den Übertragungspuffer zulässig ist. Dieses Feature beschränkt Sie auf die Übertragung von nur textbasierten Dateien.

In diesem Artikel wird die Verwendung des MSComm-Steuerelements zum Übertragen und Empfangen von Binärdaten mithilfe des RS-232-Kabels veranschaulicht. (Die Techniken in diesem Artikel funktionieren auch mit Modems.) Die Binärdaten müssen jeweils Byte für Byte in Zeichen umgewandelt und dann übertragen werden. Wenn empfangen, müssen die Daten aus Zeichen zurück in binäre Daten 1 Byte nach dem anderen konvertiert werden.

Bei DBCS-fähigen Betriebssystemen (ausgeführte Betriebssystemsoftware, die einen der Double-Byte-Zeichensätze verwendet), werden Binäre Daten beschädigt, wenn einer der Binärwerte einem DBCS-Leadzeichen entspricht. Das MSComm-Steuerelement interpretiert dieses Byte und das folgende Byte als ein Doppelbytezeichen und gibt nur 1 Byte für das entsprechende ASCII-Zeichen zurück. Um dieses Problem zu beheben, müssen Sie 1 Byte in ASCII-Größe von drei Zeichen konvertieren, um das Leadzeichen beizubehalten.

Beispielcode

Der folgende Code veranschaulicht diesen Prozess.

Warnung

DIE VERWENDUNG DES BEISPIELCODES, DER IN DIESEM ARTIKEL BEREITGESTELLT WIRD, BESTEHT AUF EIGENE GEFAHR. Microsoft stellt diesen Beispielcode "wie ist" ohne Gewährleistung jeglicher Art bereit, entweder ausgedrückt oder impliziert, einschließlich, aber nicht beschränkt auf die impliziten Gewährleistungen der Händlerbarkeit und/oder Eignung für einen bestimmten Zweck.

* 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
-----------------------

Die ereignisgesteuerte Methode generiert ein OnComm-Ereignis, wenn im Eingabepuffer Zeichen warten. Außerdem wird die Eigenschaft CommEvent eine numerische 2 enthalten. Damit das OnComm-Ereignis ausgelöst wird, müssen Sie die Rthreshold Eigenschaft auf einen anderen Wert als 0 (standard) festlegen. Die häufigste Einstellung für die RThreshold Eigenschaft ist 1, was bedeutet, dass das OnComm-Ereignis ausgelöst wird, wenn mindestens ein Zeichen im Eingabepuffer wartet. In diesem Artikel wird 3 als Eigenschaftswert verwendet, da RThreshold Zeichen gleichzeitig gesendet werden.