Transmettre et recevoir des données binaires à l’aide du contrôle MSComm32 VFP

Cet article explique comment utiliser le contrôle MSComm32.ocx pour recevoir et transmettre des données binaires sur un câble RS-232 sans modem.

Version d’origine du produit : Visual FoxPro
Numéro de la base de connaissances d’origine : 154741

Résumé

Cet article illustre certaines techniques utilisant le contrôle MSComm (Visual FoxPro 3.0 Communications) pour recevoir et transmettre des données binaires sur un câble RS-232 (sans modems).

Informations supplémentaires

Le contrôle Communications, MSCOMM32. OCX fournit des communications série pour votre application en autorisant la transmission et la réception de données via un port série où seule une chaîne de caractères vers la mémoire tampon de transmission est autorisée. Cette fonctionnalité vous limite à la transmission de fichiers texte uniquement.

Cet article explique comment utiliser le contrôle MSComm pour transmettre et recevoir des données binaires à l’aide d’un câble RS-232. (Les techniques décrites dans cet article fonctionnent également avec les modems.) Les données binaires doivent être converties de 1 octet à la fois en caractère, puis transmises. Une fois reçues, les données doivent être converties à partir d’un caractère en données binaires de 1 octet à la fois.

Sur les systèmes d’exploitation compatibles DBCS (exécutant un logiciel de système d’exploitation qui utilise l’un des jeux de caractères codés sur deux octets), les données binaires sont endommagées si l’une des valeurs binaires correspond à un caractère principal DBCS. Le contrôle MSComm interprète cet octet et l’octet suivant comme un caractère codé sur deux octets et ne retourne que 1 octet pour le caractère ASCII équivalent. Pour résoudre ce problème, vous devez convertir 1 octet en taille ASCII de trois caractères afin de conserver le caractère principal.

Exemple de code

Le code suivant illustre ce processus.

Avertissement

L’UTILISATION DE L’EXEMPLE DE CODE FOURNI DANS CET ARTICLE EST À VOS PROPRES RISQUES. Microsoft fournit cet exemple de code « tel quel » sans garantie d’aucune sorte, expresse ou implicite, y compris, mais sans s’y limiter, les garanties implicites de qualité marchande et/ou d’adéquation à un usage particulier.

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

La technique pilotée par les événements génère un événement OnComm quand des caractères sont en attente dans la mémoire tampon d’entrée. En outre, la CommEvent propriété contient un nombre 2. Pour que l’événement OnComm soit déclenché, vous devez définir la Rthreshold propriété sur une valeur autre que zéro (sa valeur par défaut). Le paramètre le plus courant pour la RThreshold propriété est 1, ce qui signifie que l’événement OnComm est déclenché si au moins un caractère est en attente dans la mémoire tampon d’entrée. Dans cet article, 3 est utilisé comme valeur de RThreshold propriété, car trois caractères à la fois sont envoyés.