*** tcl\win\tclWinSerial.c.old	Wed Nov 27 08:03:56 2002
--- tcl\win\tclWinSerial.c	Sun Dec 29 13:29:40 2002
***************
*** 189,194 ****
--- 189,195 ----
                  Tcl_Interp *interp, CONST char *optionName,
                  CONST char *value));
  static DWORD WINAPI     SerialWriterThread(LPVOID arg);
+ static int      setDefaultOptions (HANDLE handle);
  
  /*
   * This structure describes the channel type structure for command serial
***************
*** 1457,1463 ****
       */
      SetCommTimeouts(handle, &no_timeout);
  
- 
      if (permissions & TCL_READABLE) {
          infoPtr->osRead.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
      }
--- 1458,1463 ----
***************
*** 1483,1488 ****
--- 1483,1497 ----
      Tcl_SetChannelOption(NULL, infoPtr->channel, "-translation", "auto");
      Tcl_SetChannelOption(NULL, infoPtr->channel, "-eofchar", "\032 {}");
  
+ 
+     /*
+      * Setup default configuration
+      * Reset handshake, for Tcl < 8.4 this has implicitly be done by 
+      * configuring -mode.
+      */
+     setDefaultOptions(handle);
+     Tcl_SetChannelOption(NULL, infoPtr->channel, "-handshake", "none");
+ 
      return infoPtr->channel;
  }
  
***************
*** 1554,1559 ****
--- 1563,1602 ----
  /*
   *----------------------------------------------------------------------
   *
+  * setDefaultOptions --
+  *
+  *  Sets the default options of a serial channel.
+  *
+  * Results:
+  *  1=success, 0=error
+  *----------------------------------------------------------------------
+  */
+ static int 
+ setDefaultOptions (handle)
+     HANDLE handle;
+ {
+     DCB dcb;
+ 
+     if (! GetCommState(handle, &dcb)) {
+         return 0;
+     }
+ 
+     /* Default settings for serial communications */ 
+     dcb.fBinary = TRUE;
+     dcb.fErrorChar = FALSE;
+     dcb.fNull = FALSE;
+     dcb.fAbortOnError = FALSE;
+ 
+     if (! SetCommState(handle, &dcb) ) {
+         return 0;
+     }
+ 
+     return 1; 
+ }
+ 
+ /*
+  *----------------------------------------------------------------------
+  *
   * SerialSetOptionProc --
   *
   *  Sets an option on a channel.
***************
*** 1595,1600 ****
--- 1638,1644 ----
      * Option -mode baud,parity,databits,stopbits
      */
      if ((len > 2) && (strncmp(optionName, "-mode", len) == 0)) {
+         DCB mode;
          
          if (! GetCommState(infoPtr->handle, &dcb)) {
              if (interp) {
***************
*** 1603,1610 ****
              }
              return TCL_ERROR;
          }
          native = Tcl_WinUtfToTChar(value, -1, &ds);
!         result = (*tclWinProcs->buildCommDCBProc)(native, &dcb);
          Tcl_DStringFree(&ds);
          
          if (result == FALSE) {
--- 1647,1664 ----
              }
              return TCL_ERROR;
          }
+ 
+         /* 
+         * Work on a copy(mode) of the current configuration(dcb)
+         * to make sure we have a proper DCB
+         */
+         memmove(&mode, &dcb, sizeof(DCB));
+ 
+         /* 
+         * Let the windows API parse the -mode string
+         */
          native = Tcl_WinUtfToTChar(value, -1, &ds);
!         result = (*tclWinProcs->buildCommDCBProc)(native, &mode);
          Tcl_DStringFree(&ds);
          
          if (result == FALSE) {
***************
*** 1616,1626 ****
              return TCL_ERROR;
          }
  
!         /* Default settings for serial communications */ 
!         dcb.fBinary = TRUE;
!         dcb.fErrorChar = FALSE;
!         dcb.fNull = FALSE;
!         dcb.fAbortOnError = FALSE;
  
          if (! SetCommState(infoPtr->handle, &dcb) ) {
              if (interp) {
--- 1670,1684 ----
              return TCL_ERROR;
          }
  
!         /* 
!         * Windows BuildCommDCB() implicitly resets handshake.
!         * We use only "baud,parity,data,stop", otherwise the order of
!         * the -mode, -handshake options becomes important (bug#656112).
!         */
!         dcb.BaudRate = mode.BaudRate;
!         dcb.Parity   = mode.Parity;
!         dcb.ByteSize = mode.ByteSize;
!         dcb.StopBits = mode.StopBits;
          
          if (! SetCommState(infoPtr->handle, &dcb) ) {
              if (interp) {
