Unexpected long pyserial read delay on Windows

Grant Edwards grante at visi.com
Sun Feb 22 11:57:17 EST 2009


On 2009-02-22, John Nagle <nagle at animats.com> wrote:

> I've been using PySerial on Windows (Win2000, amusingly) to
> drive a Baudot teletype at 45.45 baud.  Input and output work,
> but there's a delay of about 1 second (!) on the input side
> between receiving a character and reporting it to the program.

The UART you're using almost certainly has a receive FIFO.
Normally, the UART doesn't interrupt the CPU to tell it there's
receeve data ready until the FIFO is almost full (eg 12 bytes
present in a 16 byte FIFO).

If the UART has an empty receive FIFO, and it receives a single
character that character goes into the receive FIFO.  If data
stops coming in before the rx FIFO threshold is reached, the
UART will wait 40 bit-times and then interrupt the CPU to tell
it there is receive data ready.

The thought is that maybe there's more data coming -- we don't
want to waste the CPU's time handling a single byte if there's
more data coming in.

At 45.45 baud, 40 bit-times is pretty close to 1 second.

If you don't want to wait 40-bit times for the rx data timeout,
then you need to disable the rx FIFO.  I'm not sure how you do
that in Windows.  I don't remember seeing anything in pyserial
to do it, but I avoid Windows as much as possible.  You might
want to go looking around in the device manager to see if
there's a checkbox "disalbe FIFO" in the serial port driver
config.

If not, then Google can probably help.

-- 
Grant




More information about the Python-list mailing list