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 "http://pyserial.wiki.sourceforge.net/pySerial". 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 "serialutil.py", at line 9, and "serialwin32.py" at lines 141-146.
Microsoft documentation
("http://msdn.microsoft.com/en-us/library/aa363214(VS.85).aspx") 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
--
http://mail.python.org/mailman/listinfo/python-list