diff --git a/serial_windows.go b/serial_windows.go index e84ea08..e393d4e 100644 --- a/serial_windows.go +++ b/serial_windows.go @@ -382,7 +382,17 @@ func (port *windowsPort) SetReadTimeout(timeout time.Duration) error { } func (port *windowsPort) Break(d time.Duration) error { - return &PortError{code: FunctionNotImplemented} + if err := setCommBreak(port.handle); err != nil { + return &PortError{causedBy: err} + } + + time.Sleep(d) + + if err := clearCommBreak(port.handle); err != nil { + return &PortError{causedBy: err} + } + + return nil } func createOverlappedEvent() (*syscall.Overlapped, error) { diff --git a/syscall_windows.go b/syscall_windows.go index baa4deb..3b86776 100644 --- a/syscall_windows.go +++ b/syscall_windows.go @@ -25,3 +25,7 @@ package serial //sys getOverlappedResult(handle syscall.Handle, overlapEvent *syscall.Overlapped, n *uint32, wait bool) (err error) = GetOverlappedResult //sys purgeComm(handle syscall.Handle, flags uint32) (err error) = PurgeComm + +//sys setCommBreak(handle syscall.Handle) (err error) = SetCommBreak + +//sys clearCommBreak(handle syscall.Handle) (err error) = ClearCommBreak diff --git a/zsyscall_windows.go b/zsyscall_windows.go index e848c9f..a2411a6 100644 --- a/zsyscall_windows.go +++ b/zsyscall_windows.go @@ -42,6 +42,7 @@ var ( modkernel32 = windows.NewLazySystemDLL("kernel32.dll") procRegEnumValueW = modadvapi32.NewProc("RegEnumValueW") + procClearCommBreak = modkernel32.NewProc("ClearCommBreak") procCreateEventW = modkernel32.NewProc("CreateEventW") procEscapeCommFunction = modkernel32.NewProc("EscapeCommFunction") procGetCommModemStatus = modkernel32.NewProc("GetCommModemStatus") @@ -49,6 +50,7 @@ var ( procGetOverlappedResult = modkernel32.NewProc("GetOverlappedResult") procPurgeComm = modkernel32.NewProc("PurgeComm") procResetEvent = modkernel32.NewProc("ResetEvent") + procSetCommBreak = modkernel32.NewProc("SetCommBreak") procSetCommState = modkernel32.NewProc("SetCommState") procSetCommTimeouts = modkernel32.NewProc("SetCommTimeouts") ) @@ -61,6 +63,14 @@ func regEnumValue(key syscall.Handle, index uint32, name *uint16, nameLen *uint3 return } +func clearCommBreak(handle syscall.Handle) (err error) { + r1, _, e1 := syscall.Syscall(procClearCommBreak.Addr(), 1, uintptr(handle), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + func createEvent(eventAttributes *uint32, manualReset bool, initialState bool, name *uint16) (handle syscall.Handle, err error) { var _p0 uint32 if manualReset { @@ -126,6 +136,14 @@ func resetEvent(handle syscall.Handle) (err error) { return } +func setCommBreak(handle syscall.Handle) (err error) { + r1, _, e1 := syscall.Syscall(procSetCommBreak.Addr(), 1, uintptr(handle), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + func setCommState(handle syscall.Handle, dcb *dcb) (err error) { r1, _, e1 := syscall.Syscall(procSetCommState.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(dcb)), 0) if r1 == 0 {