Dela via


Överföra och ta emot binära data med hjälp av VFP MSComm32-kontrollen

Den här artikeln beskriver hur du använder MSComm32.ocx-kontrollen för att ta emot och överföra binära data via en RS-232-kabel utan modem.

Ursprunglig produktversion: Visual FoxPro
Ursprungligt KB-nummer: 154741

Sammanfattning

Den här artikeln illustrerar några tekniker som använder kontrollen Visual FoxPro 3.0 Communications (MSComm) för att ta emot och överföra binära data via RS-232-kabel utan att ha modem.

Mer information

Kommunikationskontrollen MSCOMM32. OCX tillhandahåller seriekommunikation för ditt program genom att tillåta överföring och mottagning av data via en seriell port där endast en sträng med tecken till överföringsbufferten tillåts. Den här funktionen begränsar dig till att endast överföra textbaserade filer.

Den här artikeln visar hur du använder MSComm-kontrollen för att överföra och ta emot binära data med hjälp av RS-232-kabel. (Teknikerna i den här artikeln fungerar också med modem.) Binära data måste konverteras 1 byte åt gången till ett tecken och sedan överföras. När de tas emot måste data konverteras från ett tecken tillbaka till binära data 1 byte i taget.

På DBCS-aktiverade operativsystem (kör operativsystemprogramvara som använder en av teckenuppsättningarna med dubbla byte) skadas binära data om ett av de binära värdena matchar ett DBCS-leadtecken. MSComm-kontrollen tolkar bytet och följande byte som ett dubbelbytetecken och returnerar endast 1 byte för motsvarande ASCII-tecken. För att lösa det här problemet måste du konvertera 1 byte till tre tecken i ASCII-format för att bevara det inledande tecknet.

Exempelkod

Följande kod illustrerar den här processen.

Varning

ANVÄNDNINGEN AV EXEMPELKODEN SOM ANGES I DEN HÄR ARTIKELN ÄR PÅ EGEN RISK. Microsoft tillhandahåller den här exempelkoden "som den är" utan garanti av något slag, antingen uttryckt eller underförstådd, inklusive men inte begränsat till underförstådda garantier för säljbarhet och/eller lämplighet för ett visst syfte.

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

Den händelsedrivna tekniken genererar en OnComm-händelse när det finns tecken som väntar i indatabufferten. Dessutom innehåller egenskapen CommEvent ett numeriskt 2. För att OnComm-händelsen ska utlösas måste du ange Rthreshold egenskapen till ett annat värde än noll (standardvärdet). Den vanligaste inställningen för RThreshold egenskapen är 1, vilket innebär att Händelsen OnComm utlöses om minst ett tecken väntar i indatabufferten. I den här artikeln används 3 som ett värde för RThreshold egenskapen eftersom tre tecken i taget skickas.