win32: fix close and improve cancel (no error when write is canceled)
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 @@
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 @@
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 @@
# 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 @@
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