Transmitir e receber dados binários usando o controle VFP MSComm32

Este artigo descreve como usar o controle MSComm32.ocx para receber e transmitir dados binários por um cabo RS-232 sem modems.

Versão original do produto: Visual FoxPro
Número de KB original: 154741

Resumo

Este artigo ilustra algumas técnicas usando o controle MSComm (Comunicações do Visual FoxPro 3.0) para receber e transmitir dados binários por cabo RS-232 (sem ter modems).

Mais informações

O controle comunicações, MSCOMM32. OCX fornece comunicações serial para seu aplicativo permitindo a transmissão e a recepção de dados por meio de uma porta serial em que apenas uma cadeia de caracteres para o buffer de transmissão é permitida. Esse recurso limita você a transmitir apenas arquivos baseados em texto.

Este artigo demonstra como usar o controle MSComm para transmitir e receber dados binários usando o cabo RS-232. (As técnicas neste artigo também funcionarão com modems.) Os dados binários devem ser convertidos 1 byte de cada vez em um caractere e transmitidos. Quando recebidos, os dados devem ser convertidos de um caractere de volta em dados binários 1 byte por vez.

Em sistemas operacionais habilitados para DBCS (executando um software do sistema operacional que usa um dos conjuntos de caracteres de bytes duplos), os dados binários serão corrompidos se um dos valores binários corresponder a um caractere de liderança DBCS. O controle MSComm interpretará esse byte e o seguinte byte como um caractere de byte duplo e retornará apenas 1 byte para o caractere ASCII equivalente. Para resolve esse problema, você precisa converter 1 byte em tamanho ASCII de três caracteres para preservar o caractere principal.

Código de exemplo

O código a seguir ilustra esse processo.

Aviso

O USO DO CÓDIGO DE EXEMPLO FORNECIDO NESTE ARTIGO ESTÁ EM SEU PRÓPRIO RISCO. A Microsoft fornece esse código de exemplo "como está" sem garantia de qualquer tipo, expresso ou implícito, incluindo, mas não se limitando às garantias implícitas de comercialização e/ou aptidão para uma finalidade específica.

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

A técnica controlada por eventos gera um evento OnComm quando há caracteres esperando no buffer de entrada. Além disso, a CommEvent propriedade conterá um numérico 2. Para que o evento OnComm seja acionado, você deve definir a Rthreshold propriedade como um valor diferente de zero (seu padrão). A configuração mais comum para a RThreshold propriedade é 1, o que significa que o evento OnComm é disparado se um mínimo de um caractere estiver esperando no buffer de entrada. Neste artigo, 3 está sendo usado como um valor de RThreshold propriedade porque três caracteres por vez estão sendo enviados.