Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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.