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

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

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

Zusammenfassung

In diesem Artikel werden einige Techniken veranschaulicht, die das MSComm-Steuerelement (Visual FoxPro 3.0 Communications) zum Empfangen und Übertragen von Binärdaten über ein 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 Zeichenzeichenfolge an den Übertragungspuffer zulässig ist. Dieses Feature schränkt Sie ein, nur textbasierte Dateien zu übertragen.

In diesem Artikel wird veranschaulicht, wie Sie das MSComm-Steuerelement verwenden, um Binärdaten mithilfe eines RS-232-Kabels zu übertragen und zu empfangen. (Die Techniken in diesem Artikel funktionieren auch mit Modems.) Die Binärdaten müssen 1 Byte gleichzeitig in ein Zeichen konvertiert und dann übertragen werden. Wenn sie empfangen werden, müssen die Daten von einem Zeichen wieder zurück in Binärdaten konvertiert werden, 1 Byte gleichzeitig.

Auf DBCS-fähigen Betriebssystemen (unter Betriebssystemsoftware, die einen der Doppelbytezeichensätze verwendet) werden Binärdaten beschädigt, wenn einer der Binärwerte mit einem DBCS-Hauptzeichen übereinstimmt. 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 eine ASCII-Größe von drei Zeichen konvertieren, um das Hauptzeichen beizubehalten.

Beispielcode

Der folgende Code veranschaulicht diesen Prozess.

Warnung

DIE VERWENDUNG DES IN DIESEM ARTIKEL BEREITGESTELLTEN BEISPIELCODES ERFOLGT AUF EIGENES RISIKO. Microsoft stellt diesen Beispielcode "wie besieht" ohne jegliche Gewährleistung bereit, weder ausdrücklich noch konkludent, einschließlich, aber nicht beschränkt auf die impliziten Gewährleistungen der Handelsüblichkeit 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 Technik generiert ein OnComm-Ereignis, wenn Zeichen im Eingabepuffer warten. Außerdem enthält die CommEvent -Eigenschaft eine numerische 2. 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 Wert der RThreshold Eigenschaft verwendet, da drei Zeichen gleichzeitig gesendet werden.