Commit c5ea29f9 authored by Mike McCormack's avatar Mike McCormack Committed by Alexandre Julliard

Return TRUE on success in COMM_BuildOldCommDCB.

DCB16.BaudRate > 57600 means 115200. OpenComm16 should use overlapped I/O.
parent 32fb5805
......@@ -211,7 +211,7 @@ BOOL WINAPI COMM_BuildOldCommDCB(LPCSTR device, LPDCB lpdcb)
lpdcb->fRtsControl = RTS_CONTROL_ENABLE;
}
return 0;
return TRUE;
}
/**************************************************************************
......@@ -844,10 +844,6 @@ BOOL WINAPI SetCommState(
port.c_lflag &= ~(ICANON|ECHO|ISIG);
port.c_lflag |= NOFLSH;
/*
** MJM - removed default baudrate settings
** TRACE(comm,"baudrate %ld\n",lpdcb->BaudRate);
*/
#ifdef CBAUD
port.c_cflag &= ~CBAUD;
switch (lpdcb->BaudRate) {
......
......@@ -504,7 +504,8 @@ INT16 WINAPI OpenComm16(LPCSTR device,UINT16 cbInQueue,UINT16 cbOutQueue)
return IE_OPEN;
handle = CreateFileA(device, GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, 0, 0 );
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS,
FILE_FLAG_OVERLAPPED|FILE_FLAG_NO_BUFFERING, 0 );
if (handle == INVALID_HANDLE_VALUE) {
ERR("Couldn't open %s ! (%s)\n", COM[port].devicename, strerror(errno));
return IE_HARDWARE;
......@@ -874,10 +875,36 @@ INT16 WINAPI SetCommState16(LPDCB16 lpdcb)
memset(&dcb,0,sizeof dcb);
dcb.DCBlength = sizeof dcb;
if(lpdcb->BaudRate==57601)
/*
* according to MSDN, we should first interpret lpdcb->BaudRate as follows:
* 1. if the baud rate is a CBR constant, interpret it.
* 2. if it is greater than 57600, the baud rate is 115200
* 3. use the actual baudrate
* steps 2 and 3 are equivilent to 16550 baudrate divisor = 115200/BaudRate
* see http://support.microsoft.com/support/kb/articles/q108/9/28.asp
*/
switch(lpdcb->BaudRate)
{
case CBR_110: dcb.BaudRate = 110; break;
case CBR_300: dcb.BaudRate = 300; break;
case CBR_600: dcb.BaudRate = 600; break;
case CBR_1200: dcb.BaudRate = 1200; break;
case CBR_2400: dcb.BaudRate = 2400; break;
case CBR_4800: dcb.BaudRate = 4800; break;
case CBR_9600: dcb.BaudRate = 9600; break;
case CBR_14400: dcb.BaudRate = 14400; break;
case CBR_19200: dcb.BaudRate = 19200; break;
case CBR_38400: dcb.BaudRate = 38400; break;
case CBR_56000: dcb.BaudRate = 56000; break;
case CBR_128000: dcb.BaudRate = 128000; break;
case CBR_256000: dcb.BaudRate = 256000; break;
default:
if(lpdcb->BaudRate>57600)
dcb.BaudRate = 115200;
else
dcb.BaudRate = lpdcb->BaudRate;
}
dcb.ByteSize=lpdcb->ByteSize;
dcb.StopBits=lpdcb->StopBits;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment