[Vm-dev] Serial communications: Linux vs. Windows

David T. Lewis lewis at mail.msen.com
Wed Nov 24 21:29:59 UTC 2010


On Wed, Nov 24, 2010 at 02:10:44PM -0500, Schwab,Wilhelm K wrote:
> 
> The linux vm codes stop bits as follows: 0=1.5, 1=1, 2=2.  I have long seen it (on Windows) expressed as 
> 
> 	ONESTOPBIT := 0.
> 	ONE5STOPBITS := 1.
> 	TWOSTOPBITS := 2.

The Windows and Unix SerialPlugin code the stop bits identically, although
on Unix the 1.5 setting apparently gets rounded up to 2. See man termios
for the reason.

Windows:

  /* set stop bits */
  switch(stopBitsType) {
    case 0: dcb.StopBits = 1; break; /* 1.5 stop bits */
    case 1: dcb.StopBits = 0; break; /* 1 stop bit */
    case 2: dcb.StopBits = 2; break; /* 2 stop bits */
    default: goto errExit;
  }

Unix:

/* stopBits	0=1.5, 1=1, 2=2 */
/* I don't know how to get 1.5 stop bits. Oh well. So you get 2 instead */
#define MAX_STOP_BITS 2
/* c_cflag definitions */
static const unsigned int stopBitsDecode[MAX_STOP_BITS + 1] = { CSTOPB, 0, CSTOPB };

> Someone trying to write code that works across platforms will get snagged,
> at least if using the usual Windows definitions.  Is this something that
> can/should be done better to make the stop bits as platform-neutral as
> possible?  What would you change?

In the plugin, I would change nothing. In class SerialPlugin, I would
add some better method comments.

If I wanted my application code to be easier to understand for someone
accustomed to Windows headers, I might consider making ONESTOPBIT,
ONE5STOPBITS and TWOSTOPBITS be class variables somewhere in my 
application. But that looks a bit silly, so I guess I just go with
the method comments and leave it at that.

Dave
 


More information about the Vm-dev mailing list