Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
MS Comm experts
Message
From
07/02/2002 11:50:55
 
General information
Forum:
Visual FoxPro
Category:
ActiveX controls in VFP
Title:
Miscellaneous
Thread ID:
00614817
Message ID:
00616699
Views:
48
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
>This makes no sense!!! I just was debugging this thing and I have a set step on right the code I have below. When I look at the thisform.buffer it has the first 8 characters of the bar code and the this.input has the rest with a CRLF. As you can see I am not doing anything else with this code. It is crazy!!!
>
>I am scanning a 3 x 9 21 character bar code.
>
>>I am still trying to figure out what is going on here. In the OnComm method I have
>>
>>if this.commevent = 2
>>   thisform.buffer = ""
>>   thisform.buffer = this.input
>>...
>>
>>
>>Then when I debug the first time it is fine. The second time it looks like it adds the input to the previous input but it is truncated. Not 2 complete data scans. What do I need to do to reset this object?
>>
>>
>>>Reading the control.input does indeed clear THAT buffer. The buffer I was referring to is your form property that your are .input - ing into.
>>>
>>>If your read up to your terminating character, what do you do if more data is in the buffer? Throw it away? Keep it until next time? Do you remove just what you want, then discard the rest? These are decisions you must make :>) If you have the data you need from your scan, and don't care after that, a simple
>>>
>>>THISFORM.yourbufferproperty = ""
>>>
>>>will take care of clearing the buffer.
>>>
>>>Depending on your application, sometimes it is desirable to process the data in chunks. Let's say you have incoming text stream with CRLF combinations as a terminator. If I search the buffer for the CRLF pair, I know I have a complete line intact and can extract that from the buffer, and THEN delete that line from the buffer, leaving the remaining intact as it is incomplete at this moment. Does that make any sense?
>>>
>>>>What is the best way to clear buffer? Of course, I am clearing the form buffer property everytime the oncomm is called. It looked like the input property cleared out by it self. How can I make sure the buffer is cleared?
.·*´¨)
.·`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
Next
Reply
Map
View

Click here to load this message in the networking platform