Question re threading and serial i/o
frank at chagford.com
Thu Nov 6 11:51:42 CET 2003
> Frank Millman wrote:
> > def scan():
> > p = file('/dev/ttyS0')
> > txt = 
> > while x:
> > ch = p.read(1)
Peter Hansen wrote:
> The last line above is the heart of the problem...
> You need to use the select.select() 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 -
p = os.open('/dev/ttyS0',os.O_RDONLY|os.O_NONBLOCK)
This is my Mk 3 version, using select() -
p = file('/dev/ttyS0')
ans = select.select([p],,,0.1)
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