On Fri, 02 Mar 2012 09:46:22 -0700, hamilton <
hami...@nothere.com>
wrote:
While the Win32 API provides a standard set of values for the baud
rate (CBR_1200, CBR_9600, etc.), it's just a 32 bit field in the DCB,
and you can set a specific baud rate other than the ones with standard
definitions. The actual interpretation is left to the device driver.
But the standard CBR values are not really powers of two in any sense.
Much original hardware used a divider that divided a clock (1.843MHz)
by some multiple of 16*. So the original serial ports could be
programmed for 115,200 baud by setting the divisor to 1. You'd get
57600 with a divisor of two, but rates like 9600 or 19,200 required
non-power of two divisors (12 or 6). Nor did 110 ever work out quite
right (but close enough of async serial communications). And Windows
supplies "standard" values of CBR_128000 and CBR_256000, which don't
fit the pattern at all.
Of course many applications that can drive a serial port only present
a fixed set of choices. Often those lists are slightly odd -
Windows's Hyperterminal, for example, included 230,400 and 460,800,
which don't have standard CBR_ definitions, as choices, but not the
128,000 or 256,000 values. Also many device driver only implement the
standard values, even if the hardware they're supporting can handle
other values.
*The most common async receiver technique sampled the signal 16 times
per bit - and while other techniques were occasionally used, the 16
times sampling was used on dozens, if not hundreds of UART designs,
including the 8250 and its successors using in hundreds of millions of
PCs.