-
May 20th, 2009, 02:39 AM
#1
DoEvents serial port question.
Hello:
I am using the serial port to send & receive info.
When I send something I need to wait until something comes back (ONcomm event), or a timer timeout occurs (error-->no response), whichever happens first. Otherwise I wait in a while loop waiting for one or the other.
In order to respond to these events I think I must use a DoEvents....however this seems to open up to any event, whci causes bad things to happen.
Is there a way to limit the while loop to respond only to the Oncomm or timout (timer) event, rather than any event in the whole system? The main problem is that new things are getting sent out from various other timers & user clicks before the reception is complete.
Is it possible to wait for a reception or timer timeout, without using Doevents? Nothing else needs to happen during this lull in waiting.
-
May 20th, 2009, 06:44 AM
#2
Re: DoEvents serial port question.
You can set a Global variable in OnComm() and in Timer() events.
Code:
Public OnCommHappened as Boolean
Public TimeoutHappened as Boolean
'in _OnComm()
...
OnCommHappened = True
...
'in _Timer()
TimeOutHappened = True
...
'in your loop
If TimeoutHappened or OnCommHappened then Exit While
The only problem I see, I think without the DoEvents no OnComm() event would be raised...
-
May 20th, 2009, 08:51 AM
#3
Re: DoEvents serial port question.
You would need to have something like a busy flag that is set to true when you start your wait and then in the events that you do not want to fire a check of that flag that will exit the event if busy. Or you could disable your form while busy which would stop the user from clicking any controls or entering data while you are waiting.
-
May 20th, 2009, 09:14 AM
#4
Re: DoEvents serial port question.
It sounds like you are saying I DO need DoEvents...but is there a way to limit them?
I only want to respond to a timeout (generate an error message) or an incoming MScomm message (data coming in). I really don't want to use doevents, but is there any other way. Doevents seems to allow other things to happen such as sending new messages before replies to old ones have been rcvd. Thus things get out of sync.
S=send R=recieve reply
instead of: SA RA SB RC SD RD SE RE....YOU MIGHT GET SA RA SB RB SC SD RC RD
creating quite a mess.
-
May 20th, 2009, 10:49 AM
#5
Re: DoEvents serial port question.
Well, you can poll the MSComm in your loop, then you do not need to use the OnComm().
Code:
dim a$, tmo&
tmo = 100000
do
a$=MSComm.Input
if a$="" then tmo = tmo -1
loop until a$<>"" or tmo = 0
This loop will run until either a character arrived at the com port, or the counting down of tmo has reached 0.
After that loop you check if a$="" then we have timeout
This runs completely without DoEvents, but the timeout counting is not so elegant...
You'd have to work out the constant yourself. I only put tmo = 100000 just out of thin air. Maybe it is to short a timeout.
-
May 20th, 2009, 11:21 AM
#6
Re: DoEvents serial port question.
thanks Wof !!!
I was thinking of using a sleep(xxx) to cause a delay in the receive/wait loop, but then you can't exit "immediately" when something is received.
...I saw an example of using a system api that was somthing like tickcount or count ticks, that could be used to measure a delay (rather than forceing you to wait for a sleep to expire)...
Do you happen to know what function I'm referring to? I should have paid more attention to it, but now can't seem to find it.
-
May 20th, 2009, 11:48 AM
#7
Re: DoEvents serial port question.
http://allapi.mentalis.org/apilist/GetTickCount.shtml
Quite a good Idea. Better'n counting.
I'll be back later to help if you can't work it out. Look at the samples anyway.
-
May 20th, 2009, 12:54 PM
#8
Re: DoEvents serial port question.
Thanks Wof
by the way I'm posting an interesting question about doevents.
-
May 20th, 2009, 02:50 PM
#9
Re: DoEvents serial port question.
Ok, I shall look at it.
Here is how I would implement a timeout using gettickcount
Code:
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Const Max_TimeOutTicks = 5000 'approx. 5 seconds
Private Function GetComChar() As Long
Dim begin&, c$
begin = GetTickCount
Do
c$ = MSComm.Input
Loop Until c$ <> "" Or GetTickCount - begin > Max_imeOutCount
If c$ <> "" Then GetComChar = Asc(c$) Else GetComChar = -1
End Function
The function would return -1 if timeout occured, otherwise it would return the Asc of the character received.
As the return value is a long you wouldn't get conflicts. You can (if it is not -1) convert it to chr$() without problem. -1 instead would indicate timeout.
Tags for this Thread
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|