Transmisión y recepción de datos binarios mediante el control MSComm32 de VFP

En este artículo se describe cómo usar el control MSComm32.ocx para recibir y transmitir datos binarios a través de un cable RS-232 sin módems.

Versión original del producto: Visual FoxPro
Número de KB original: 154741

Resumen

En este artículo se muestran algunas técnicas que usan el control Comunicaciones de Visual FoxPro 3.0 (MSComm) para recibir y transmitir datos binarios a través del cable RS-232 (sin tener módems).

Más información

Control de comunicaciones, MSCOMM32. OCX, proporciona comunicaciones serie para la aplicación al permitir la transmisión y recepción de datos a través de un puerto serie donde solo se permite una cadena de caracteres al búfer de transmisión. Esta característica le limita a transmitir solo archivos basados en texto.

En este artículo se muestra cómo usar el control MSComm para transmitir y recibir datos binarios mediante el cable RS-232. (Las técnicas de este artículo también funcionarán con módems). Los datos binarios deben convertirse 1 byte a la vez en un carácter y, a continuación, transmitirse. Cuando se reciben, los datos se deben convertir de un carácter de nuevo en datos binarios de 1 byte a la vez.

En los sistemas operativos habilitados para DBCS (que ejecutan software de sistema operativo que usa uno de los conjuntos de caracteres de doble byte), los datos binarios se dañarán si uno de los valores binarios coincide con un carácter de cliente potencial DBCS. El control MSComm interpretará este byte y el siguiente byte como un carácter de doble byte y devolverá solo 1 byte para el carácter ASCII equivalente. Para resolver este problema, debe convertir 1 byte en un tamaño ASCII de tres caracteres para conservar el carácter principal.

Código de ejemplo

En el código siguiente se muestra este proceso.

Advertencia

EL USO DEL CÓDIGO DE EJEMPLO PROPORCIONADO EN ESTE ARTÍCULO CORRE SU PROPIO RIESGO. Microsoft proporciona este código de ejemplo "tal cual" sin garantía de ningún tipo, ya sea expresa o implícita, incluidas, entre otras, las garantías implícitas de comerciabilidad o idoneidad para un propósito determinado.

* 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 técnica controlada por eventos genera un evento OnComm cuando hay caracteres esperando en el búfer de entrada. Además, la CommEvent propiedad contendrá un valor numérico 2. Para que se desencadene el evento OnComm, debe establecer la Rthreshold propiedad en un valor distinto de cero (su valor predeterminado). La configuración más común para la RThreshold propiedad es 1, lo que significa que el evento OnComm se desencadena si un mínimo de un carácter está esperando en el búfer de entrada. En este artículo, se usa 3 como valor de RThreshold propiedad porque se envían tres caracteres a la vez.