*--------Program that sends data to the port oncommtype=ON_MESSAGE && equals 4 from define statement in example below DO MsComClear && clear the port and get it ready to receive data mscom.output="~UMI "+CHR(13) * Now in the mscom.oncomm event: *--------oncomm method #define ON_MESSAGE 4 && receive message from phonetree IF oncommtype=ON_MESSAGE *--I know that I am retrieving the current message from the phonetree system so *--I need to wait for a chr(26) to come back so I know that is the end of the *--message. Usually I will not receive a chr(26) back otherwise DO WHILE !CHR(26) $ this.lcstring *--Keep adding the value from this.input to this.lcstring property this.lcString = this.lcstring+this.input *--The next three lines for troubleshooting only ACTIVATE SCREEN ? this.lcstring WAIT WINDOW "Check the value of this.lcstring: " ENDDO ELSE *--I don't need to wait for a chr(26) from the port, just grab the information in *--in the .input property this.lcstring = this.lcstring + this.input *--The next three lines for troubleshooting only ACTIVATE SCREEN ? this.lcstring WAIT WINDOW "Check the value of this.lcstring: " ENDIF *--In some cases I have to trim off excess characters the phonetree system sends back at the *--end of the data so I would do that processing here, but otherwise I would just store *--the value to this.result for use later on IF !(this.lcstring=="") this.result=this.lcstring ENDIF RETURNYou will need to modify the code to suit your needs. To start off, I would throw the data to the screen as in the example above (minus my checks for the oncommtype) to see what you are receiving back for troubleshooting.
*------------------------------------------------------------ *--PROCEDURE MsComClear *--Used in visual foxpro only for clearing/resetting the com port *--1/23/2002 TCHolzer PROCEDURE MsComClear #IF 'VISUAL' $ UPPER(VERSION()) IF UPPER(TYPE('ComForm.MsCom'))="O" WITH COMFORM.mscom IF .PortOpen .PortOpen = .F. IF !.PortOpen mIsOpened = .F. ENDIF ENDIF IF !mIsOpened .CommPort = m_port .Settings = ALLTRIM(STR(m_baudrate))+","+s_parity+","+ALLTRIM(STR(m_databits))+","+ALLTRIM(STR(m_stopbits)) .InputLen = 0 .RThreshold=1 .SThreshold=1 .PortOpen = .T. ENDIF IF .PortOpen mIsOpened = .T. ENDIF ENDWITH WITH COMFORM.mscom 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 && comform.mscom is NOT an object - cannot access port or phonetree system MESSAGEBOX('Phonetree is experiencing a problem.'+CHR(13); +'Could not access Phonetree to reset port.'+CHR(13); +'Please exit phonetree and start again.',16,'Phonetree Error!',5000000) ENDIF && is comform.mscom an object? #ENDIF RETURNTracy
>>*--MsCommContainer.OnComm() >>*--Last Modified: >>*--TCHolzer 01/22/2002 Trimmed extra characters from receive string >>*--TCHolzer 01/31/2002 Corrected storing of input buffer to variable s for ON_LIST case >>LOCAL ; >> i,; >> istop,; >> lnStart,; >> lnBegin >>#define ON_IDLE 0 && dummy status to prevent onevent firing >>#define ON_STATUS 1 && status of phonetree >>#define ON_SIZE 2 && number of records in list >>#define ON_VERSION 3 && phonetree version >>#define ON_MESSAGE 4 && receive message from phonetree >>#define ON_LIST 5 && List messages sent to >>#define ON_PUTMSG 6 && send messge to phonetree >>#define ON_PUTLST 7 && send list to phonetree >>#define ON_STOPCALL 8 && stop calling from list immediately >>#define _END_CHAR CHR(10) >>#define _NULL CHR(0) >> >>this.creceivebuffer="" >>this.creceivestr="" >>this.lcstring="" >>this.result="" >>lnstart=SECONDS() >>lnBegin=SECONDS() >> >>IF UPPER(TYPE('OnCommType'))="N" >> THIS.oncommtype=OnCommType >> IF this.oncommtype<>ON_IDLE >> =this.waitforresponse(1) >> ELSE >> =this.waitforresponse(1) >> ENDIF >>ELSE >> this.oncommtype=0 && idle by default >> =this.waitforresponse(1) >>ENDIF >> >>LnBegin=SECONDS() >>DO WHILE THIS.commevent<>2 >> =this.waitforresponse(1) >> IF SECONDS()-LnBegin>3 >> IF this.oncommtype<>ON_IDLE >> *--Should have switched commevent to 2 by now, not receiving for some reason >> MESSAGEBOX('An Error Occurred with Phonetree.'+CHR(13); >> +'Unable to get response. Please verify'+CHR(13); >> +'the Phonetree system is turned on and'+CHR(13); >> +'try again.',48,'ERROR communicating with Phonetree.',50000000) >> ENDIF >> EXIT >> ENDIF >>ENDDO >>DO WHILE THIS.CommEvent=2 >> IF THIS.CommEvent=2 && capture the information in this.input >> IF THIS.InBufferCount>0 && received data >> *--If a message or a list was received, wait for the end of it >> IF this.oncommtype=ON_MESSAGE.OR.this.oncommtype=ON_LIST && receive message or receive list from phonetree >> lnstart=SECONDS() >> DO WHILE !CHR(26) $ this.lcstring >> this.lcString = this.lcstring+this.input >> IF this.lcString=="".or.alltrim(this.lcstring)=">" && nothing received! >> IF SECONDS()-lnstart>120 >> EXIT >> ENDIF >> ENDIF >> ENDDO >> IF this.oncommtype=ON_LIST >> s=this.lcstring >> this.result=this.lcstring >> this.lcstring="" >> ENDIF >> ELSE >> this.lcstring = this.lcstring + this.input >> ENDIF >> IF !(this.lcstring == "") >> this.result = "" >> *--we captured all of the data from the port, make sure it is not just >> *--an acknowledgement of a carriage return sent to phonetree >> IF ALLTRIM(this.lcstring)=">" && this is from all carriage returns sent to phonetree >> EXIT >> ENDIF >> i=1 >> istop=(LEN(this.lcstring)) >> IF this.oncommtype!=ON_LIST >> FOR i = 1 TO istop >> DO WHILE ASC(SUBSTR(this.lcstring, i, 1))!=0 .and. SUBSTR(this.lcstring, i, 1) != _NULL ; >> .and. ASC(SUBSTR(this.lcstring, i, 1))!=32 >> IF SUBSTR(this.lcstring, i, 1) != _END_CHAR .and. SUBSTR(this.lcstring, i, 1)!=">"; >> .and.SUBSTR(this.lcstring, i, 1) != _NULL; >> .and.ASC(SUBSTR(this.lcstring, i, 1))!=32 >> this.result = LEFT(this.lcstring, i) >> i=i+1 >> ELSE >> i=i+1 >> ENDIF >> ENDDO >> i=i+1 >> ENDFOR >> ENDIF >> ELSE >> this.result="" >> ENDIF >> IF this.oncommtype!=ON_MESSAGE .and. this.oncommtype!=ON_LIST && receive message or list from phonetree, do NOT strip >> FOR i = 1 TO LEN(this.result) >> IF ASC(SUBSTR(this.result, i, 1))=32 .and. i>1 >> this.result = LEFT(this.result, i-1) >> ENDIF >> IF ASC(SUBSTR(this.result, i, 1))=13 .and. i>1 >> this.result = LEFT(this.result, i-1) >> ENDIF >> ENDFOR >> ENDIF >> DO CASE >> CASE this.oncommtype=ON_STATUS >> mPTStatus=this.result >> CASE this.oncommtype=ON_VERSION >> mPTVersion=this.result >> CASE this.oncommtype=ON_SIZE >> mPTSize=this.result >> CASE this.oncommtype=ON_MESSAGE >> s=this.result >> CASE this.oncommtype=ON_LIST >> *Do NOTHING s is stored above >> OTHERWISE >> *DO NOTHING >> ENDCASE >> ELSE && just in case only >> EXIT >> ENDIF >> ELSE && just in case only >> EXIT >> ENDIF && is commevent 2 or not, of not we exit the loop >>ENDDO && while this.commevent=2 >>RETURN >> >>>>
>>*~ This method loops for the specified >>*~ amount of time calling DOEVENTS(). >>*~ This allows time for the modem to respond to the requests. >> >>LPARAMETERS lnDelayInSeconds >> >>LOCAL lnStartTime >>lnStartTime = SECO() >> >>DO WHILE SECO() <= (lnStartTime + lnDelayInSeconds) ; >> AND NOT SECO() < lnStartTime >> DOEVENTS() >>ENDDO >>RETURN >>>>