Question re threading and serial i/o

Frank Millman frank at
Thu Nov 6 11:51:42 CET 2003

> Frank Millman wrote:
> > 
> > def scan():
> >     p = file('/dev/ttyS0')
> >     txt = []
> >     while x:
> >         ch =
Peter Hansen wrote:

> The last line above is the heart of the problem...
> You need to use the function with a timeout, so that
> you can wake up periodically to check a flag that is set by the other
> thread, asking the i/o thread to terminate.  select() will return
> immediately if the file has data waiting to be read, so you don't
> significantly decrease the latency of the response in this way.

Thanks a lot for the reply, Peter. 

I tried select(), but I cannot get it to work properly. If I show you
what I am doing, hopefully you can point out the error of my ways.

This is my Mk 2 version, that is a bit ugly, but seems to work -
    def scan():
        p ='/dev/ttyS0',os.O_RDONLY|os.O_NONBLOCK)
        while x:
                print ord(,1))
            except OSError:

This is my Mk 3 version, using select() -
    def scan():
        p = file('/dev/ttyS0')
        while x:
            ans =[p],[],[],0.1)
            if ans[0]:
                print ord(

The scanner sends a string consisting of 'code' <tab> 'qty' <cr>. If I
scan a code of '1' and a quantity of '1', I would expect the program
to display 49 9 49 13. The Mk 2 version does this correctly.

The Mk 3 version behaves differently. After the first scan, it
displays 49. After each subsequent scan, it displays 9 49 13 49.

If anyone can explain what I am doing wrong, I will be most grateful.
In the meantime I am sticking with Mk 2, as it is doing the job.

Platform is Python 2.2.2 on Redhat 9.

Thanks in advance


More information about the Python-list mailing list