Can Python serial support run at 45.45 baud?

John Nagle nagle at
Sat Feb 14 13:59:28 EST 2009

John Nagle wrote:

>    OK, tried to open the port, using Python 2.6, latest PySerial
> and PyWin32:
>     ser = serial.Serial(port, baudrate=baud,
>             bytesize=serial.FIVEBITS,
>             parity=serial.PARITY_NONE,
>             stopbits=serial.STOPBITS_TWO)
> ValueError: Cannot configure port, some setting was wrong. Original 
> message: (87, 'SetCommState', 'The parameter is incorrect.')
>    Something doesn't like "serial.FIVEBITS".  That's a valid value, 
> according
> to "".  If changed to 
> "serial.EIGHTBITS",  the code will execute, but of course does the wrong
> thing.   That looks like a bug.

    OK, here's what's wrong.  The allowed numbers for stop bits in Windows are

	ONESTOPBIT	0	1 stop bit.
	ONE5STOPBITS	1	1.5 stop bits.
	TWOSTOPBITS	2	2 stop bits.

The Python interface, however, only exports STOPBITS_ONE and STOPBITS_TWO.
See "", at line 9, and "" at lines 141-146.

Microsoft documentation 
("") says:

     * The use of 5 data bits with 2 stop bits is an invalid combination,
	as is 6, 7, or 8 data bits with 1.5 stop bits.

So the correct combination, 5 bits with 1.5 stop bits, isn't supported in
Python.  1 stop bit will not physically work on Baudot teletypes; the
main camshaft doesn't come around fast enough.  (Yes, there's an actual
mechanical reason for 1.5 stop bits.)  Requesting 2 stop bits at the
Python level gets a reject at the Win32 level.  (Not sure why Win32
doesn't allow that; extra stop bits just add delay, but don't hurt
anything.  But it's not supported.)

Linux has a different set of restrictions; Linux offers only 1 or 2 stop
bits, and won't do arbitrary baud rates via the "termios" data structure,
although there are other ways to request that.  At the hardware level,
there's a clock rate, a counter, and a divisor, so arbitrary baud
rates can be set.

					John Nagle

More information about the Python-list mailing list