Trasmettere e ricevere dati binari usando il controllo MSComm32 VFP

Questo articolo descrive come usare il controllo MSComm32.ocx per ricevere e trasmettere dati binari su un cavo RS-232 senza modem.

Versione originale del prodotto: Visual FoxPro
Numero KB originale: 154741

Riepilogo

Questo articolo illustra alcune tecniche che usano il controllo MsComm (Visual FoxPro 3.0 Communications) per la ricezione e la trasmissione di dati binari tramite cavo RS-232 (senza modem).

Ulteriori informazioni

Controllo Communications MSCOMM32. OCX, fornisce comunicazioni seriali per l'applicazione consentendo la trasmissione e la ricezione dei dati tramite una porta seriale in cui è consentita solo una stringa di caratteri nel buffer di trasmissione. Questa funzionalità limita la trasmissione solo di file basati su testo.

Questo articolo illustra come usare il controllo MSComm per trasmettere e ricevere dati binari usando il cavo RS-232. Le tecniche descritte in questo articolo funzioneranno anche con i modem. I dati binari devono essere convertiti 1 byte alla volta in un carattere e quindi trasmessi. Al momento della ricezione, i dati devono essere convertiti da un carattere in dati binari 1 byte alla volta.

Nei sistemi operativi abilitati per DBCS (che eseguono software del sistema operativo che usa uno dei set di caratteri a doppio byte), i dati binari verranno danneggiati se uno dei valori binari corrisponde a un carattere principale DBCS. Il controllo MSComm interpreterà questo byte e il byte seguente come un carattere a byte doppio e restituirà solo 1 byte per il carattere ASCII equivalente. Per risolvere questo problema, è necessario convertire 1 byte in dimensioni ASCII di tre caratteri per mantenere il carattere principale.

Codice di esempio

Il codice seguente illustra questo processo.

Avviso

L'USO DEL CODICE DI ESEMPIO FORNITO IN QUESTO ARTICOLO È A PROPRIO RISCHIO. Microsoft fornisce questo codice di esempio "così come è" senza garanzia di alcun tipo, espressa o implicita, incluse, a titolo esemplificativo, le garanzie implicite di commerciabilità e/o idoneità per uno scopo specifico.

* 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 tecnica basata su eventi genera un evento OnComm quando sono presenti caratteri in attesa nel buffer di input. Inoltre, la CommEvent proprietà conterrà un valore numerico 2. Per attivare l'evento OnComm, è necessario impostare la Rthreshold proprietà su un valore diverso da zero (impostazione predefinita). L'impostazione più comune per la RThreshold proprietà è 1, ovvero l'evento OnComm viene attivato se nel buffer di input è in attesa almeno un carattere. In questo articolo , 3 viene usato come valore di RThreshold property perché vengono inviati tre caratteri alla volta.