*------------------------------------------------------ *--Bindeventex.prg *--MSCOMM32 and VFPCOM BINDEVENTS Example *------------------------------------------------------ CLEAR loCom = CREATEOBJECT("MSCOMMLib.MSComm") loEventHandler = NEWOBJECT("OnComm") loVFPCOM = NEWOBJECT("VFPCOM.ComUtil") loVFPCOM.BindEvents(loCom, loEventHandler) _VFP.AutoYield=.t. PUBLIC istep, lcstring lcstring="" istep=1 LOCAL i FOR istep = 1 TO 4 DO ComClear WITH loCom IF locom.portopen .PortOpen = .f. ENDIF .CommPort = istep .PortOpen = .T. .OUTPUT = [ATZ] + CHR(13) ENDWITH ENDFOR WAIT WINDOW "Closing ports..." NOWAIT FOR i=1 TO 10 IF LoCom.PortOpen LoCom.PortOpen = .F. LoCom.CommPort=i ENDIF ENDFOR locom=.null. RELEASE loCom loEventHandler=.null. RELEASE loEventhandler loVFPCOM=.null. RELEASE loVfPCOM ocomm=.null. RELEASE ocomm oncomm=.null. RELEASE oncomm RELEASE istep RELEASE lcstring WAIT WINDOW "Finished!" NOWAIT RETURN DEFINE CLASS ocomm AS OLECONTROL OLECLASS = [MSCOMMLib.MSComm.1] ENDDEFINE DEFINE CLASS oncomm AS custom PROCEDURE oncomm WAIT WINDOW "Working on Port: "+ALLTRIM(STR(locom.commport)) NOWAIT #define _END_CHAR CHR(10) #define _NULL CHR(0) LOCAL lnstart,result result="" lcstring="" lnStart=SECONDS() DO WHILE loCom.commevent<>2.and.SECONDS()-lnstart<3 =WaitForResponse(1) ENDDO IF loCom.commevent=2 DO WHILE loCom.commevent=2 lcstring=lcstring+locom.input IF lcString="" EXIT ENDIF ENDDO LOCAL istop istop=(LEN(lcstring)) FOR i = 1 TO istop DO WHILE ASC(SUBSTR(lcstring, i, 1))!=0 .and. SUBSTR(lcstring, i, 1) != _NULL ; .and. ASC(SUBSTR(lcstring, i, 1))!=32 IF SUBSTR(lcstring, i, 1) != _END_CHAR .and. SUBSTR(lcstring, i, 1)!=">"; .and.SUBSTR(lcstring, i, 1) != _NULL; .and.ASC(SUBSTR(lcstring, i, 1))!=32 result = LEFT(lcstring, i) IF ASC(SUBSTR(lcstring, i, 1))=13 .and. i>1 result = LEFT(lcstring, i-1) ENDIF IF ASC(SUBSTR(lcstring, i, 1))=32 .and. i>1 result = LEFT(lcstring, i-1) ENDIF i=i+1 ELSE i=i+1 ENDIF ENDDO i=i+1 ENDFOR lcstring=result IF "OK" $ lcstring ? "Comm Port "+ALLTRIM(STR(locom.commport))+" received : "+lcstring ELSE IF ALLTRIM(lcstring)!="" ? "Received unusual response: "+lcstring ENDIF ENDIF ENDIF RETURN ENDPROC ENDDEFINE PROCEDURE WaitForResponse LPARAMETERS lnDelayInSeconds LOCAL lnStartTime lnStartTime = SECO() DO WHILE SECO() <= (lnStartTime + lnDelayInSeconds) ; AND NOT SECO() < lnStartTime DOEVENTS() ENDDO ENDPROC PROCEDURE ComClear LOCAL mIsOpened IF UPPER(TYPE('loCom'))="O" WITH loCom IF .portopen .portopen = .F. IF !.portopen mIsopened = .F. ENDIF ENDIF IF !mIsOpened .CommPort = istep .Settings = [9600,n,8,1] .InputLen = 0 .RThreshold=1 .SThreshold=1 .PortOpen = .T. ENDIF IF .PortOpen mIsOpened = .T. ENDIF ENDWITH WITH loCom IF .portopen .PortOpen = .F. mIsOpened = .F. ENDIF IF !mIsOpened .inbuffersize=1024 .RThreshold=1 .SThreshold=1 .InputLen = 0 .PortOpen = .T. ENDIF IF .PortOpen mIsOpened = .T. ELSE mIsOpened = .F. ENDIF ENDWITH ELSE && loCom is NOT an object - cannot access port or phonetree system MESSAGEBOX('The ComPort is experiencing a problem.'+CHR(13); +'Could not reset port.'+CHR(13); +'Please start again.',16,'Com Error!',5000000) ENDIF && is loCom an object? RETURN *:EOF