From c5ea29f99bfe1b6658b1ac61ed38915eb73070b1 Mon Sep 17 00:00:00 2001 From: Mike McCormack Date: Sun, 21 Oct 2001 15:01:20 +0000 Subject: [PATCH] Return TRUE on success in COMM_BuildOldCommDCB. DCB16.BaudRate > 57600 means 115200. OpenComm16 should use overlapped I/O. --- dlls/kernel/comm.c | 6 +----- dlls/user/comm16.c | 31 +++++++++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/dlls/kernel/comm.c b/dlls/kernel/comm.c index 3a98e24ee8c..3eab1fdfdab 100644 --- a/dlls/kernel/comm.c +++ b/dlls/kernel/comm.c @@ -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) { diff --git a/dlls/user/comm16.c b/dlls/user/comm16.c index 0d45a265d43..8964c9b09a2 100644 --- a/dlls/user/comm16.c +++ b/dlls/user/comm16.c @@ -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;