From 3401840263f36691495ddb749def54e6fbd9ddf4 Mon Sep 17 00:00:00 2001 From: Chris Liechti Date: Wed, 25 May 2016 01:51:42 +0200 Subject: win32: fix close and improve cancel (no error when write is canceled) --- serial/serialwin32.py | 5 ++++- serial/win32.py | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/serial/serialwin32.py b/serial/serialwin32.py index d11a2c4..9cb2620 100644 --- a/serial/serialwin32.py +++ b/serial/serialwin32.py @@ -226,7 +226,7 @@ class Serial(SerialBase): def _close(self): """internal close port helper""" - if self._port_handle: + if self._port_handle is not None: # Restore original timeout values: win32.SetCommTimeouts(self._port_handle, self._orgTimeouts) if self._overlapped_read is not None: @@ -237,6 +237,7 @@ class Serial(SerialBase): self.cancel_write() win32.CloseHandle(self._overlapped_write.hEvent) self._overlapped_write = None + win32.CloseHandle(self._port_handle) self._port_handle = None def close(self): @@ -312,6 +313,8 @@ class Serial(SerialBase): # Wait for the write to complete. #~ win32.WaitForSingleObject(self._overlapped_write.hEvent, win32.INFINITE) err = win32.GetOverlappedResult(self._port_handle, self._overlapped_write, ctypes.byref(n), True) + if win32.GetLastError() == win32.ERROR_OPERATION_ABORTED: + return n.value # canceled IO is no error if n.value != len(data): raise writeTimeoutError return n.value diff --git a/serial/win32.py b/serial/win32.py index 2fddf6b..31f21ee 100644 --- a/serial/win32.py +++ b/serial/win32.py @@ -219,6 +219,7 @@ EV_DSR = 16 # Variable c_int MAXDWORD = 4294967295 # Variable c_uint EV_RLSD = 32 # Variable c_int ERROR_SUCCESS = 0 +ERROR_OPERATION_ABORTED = 995 ERROR_IO_INCOMPLETE = 996 ERROR_IO_PENDING = 997 # Variable c_long MS_CTS_ON = 16 # Variable c_ulong -- cgit v1.2.1