Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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.