diff --git a/serial_windows.go b/serial_windows.go index 4a504ef..90712d5 100644 --- a/serial_windows.go +++ b/serial_windows.go @@ -266,15 +266,41 @@ func (port *windowsPort) SetMode(mode *Mode) error { } func (port *windowsPort) SetDTR(dtr bool) error { - var res bool + // Like for RTS there are problems with the escapeCommFunction + // observed behaviour was that DTR is set from false -> true + // when setting RTS from true -> false + // 1) Connect -> RTS = true (low) DTR = true (low) OKAY + // 2) SetDTR(false) -> RTS = true (low) DTR = false (heigh) OKAY + // 3) SetRTS(false) -> RTS = false (heigh) DTR = true (low) ERROR: DTR toggled + // + // In addition this way the CommState Flags are not updated + /* + var res bool + if dtr { + res = escapeCommFunction(port.handle, commFunctionSetDTR) + } else { + res = escapeCommFunction(port.handle, commFunctionClrDTR) + } + if !res { + return &PortError{} + } + return nil + */ + + // The following seems a more reliable way to do it + + params := &dcb{} + if err := getCommState(port.handle, params); err != nil { + return &PortError{causedBy: err} + } + params.Flags &= dcbDTRControlDisableMask if dtr { - res = escapeCommFunction(port.handle, commFunctionSetDTR) - } else { - res = escapeCommFunction(port.handle, commFunctionClrDTR) + params.Flags |= dcbDTRControlEnable } - if !res { - return &PortError{} + if err := setCommState(port.handle, params); err != nil { + return &PortError{causedBy: err} } + return nil } @@ -283,6 +309,8 @@ func (port *windowsPort) SetRTS(rts bool) error { // it doesn't send USB control message when the RTS bit is // changed, so the following code not always works with // USB-to-serial adapters. + // + // In addition this way the CommState Flags are not updated /* var res bool