Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
MS Comm experts
Message
From
07/02/2002 13:35:02
 
General information
Forum:
Visual FoxPro
Category:
ActiveX controls in VFP
Title:
Miscellaneous
Thread ID:
00614817
Message ID:
00616830
Views:
42
It would depend on the inputlen value and the buffersize. You may have to wait until no data is being received anylonger from the port to process it. Generally, with an inputlen of 0 and a buffer size of 1024, I have never stopped grabbing the information from this.input before the port was finished receiving data, but then it could always happen, and it would only take one time for my customers to be unhappy and call it a bug!
Tracy

>No I don't need to run your code as it is. I do appreciate getting some logic on how this stuff works. My question is when I do a scan of a bar code it seems to get everything in the bar code, do I need to have to code to wait? I have not seen otherwise.
>
>>Sorry about that David. You should not need the oncommtype code yourself unless you actually want to run the code below as is which I don't recommend because I also strip the data received from the port of extranneous stuff the phonetree sends back. The oncommtype is set before the mscomm32 output is set. It just lets me know what type of data I am expecting back from the port. For instance, see this example:
>>
>>
>>*--------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
>>RETURN
>>
>>
>>You 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.
>>
>>Also, below are my settings:
>>
>>
>>*------------------------------------------------------------
>>*--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
>>RETURN
>>
>>
>>
>>Tracy
>>
>>>Thanks! I appreciate a jump start! Do I need the OnCommType code?
>>>
>>>>Hi David, I 've seen cases where using SET STEP ON really messed up with the .input value when using mscomm32. Be careful of that. I would throw it to the screen instead to check the value and use a wait window for testing the .input value (that's what I did). I've had mixed results with the oncomm event (sometimes firing, sometimes not) and finally got it working. I don't know if this will help or not, but here is my oncomm code:
>>>>
>>>>
>>>>*--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
>>>>
>>>>
>>>>
>>>>Here is the waitforresponse which I got on the UT:
>>>>
>>>>
>>>>*~ 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
>>>>
>>>>
>>>
.·*´¨)
.·`TCH
(..·*

010000110101001101101000011000010111001001110000010011110111001001000010011101010111001101110100
"When the debate is lost, slander becomes the tool of the loser." - Socrates
Vita contingit, Vive cum eo. (Life Happens, Live With it.)
"Life is not measured by the number of breaths we take, but by the moments that take our breath away." -- author unknown
"De omnibus dubitandum"
Previous
Reply
Map
View

Click here to load this message in the networking platform