summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcliechti <cliechti@f19166aa-fa4f-0410-85c2-fa1106f25c8a>2009-07-24 12:19:50 +0000
committercliechti <cliechti@f19166aa-fa4f-0410-85c2-fa1106f25c8a>2009-07-24 12:19:50 +0000
commite37b6a8374079aee9d289ce805c2ad4c43d61ce9 (patch)
treecb94ac9392bf4ac7b37fdf57854c6fcd88ba66a1
parent5fe48d4d4266d3812498d50a8736365b40216fff (diff)
downloadpyserial-git-e37b6a8374079aee9d289ce805c2ad4c43d61ce9.tar.gz
bugfix the new ctypes based implementation. example/test* run error free
-rw-r--r--pyserial/serial/serialwin32.py43
-rw-r--r--pyserial/serial/win32.py23
2 files changed, 40 insertions, 26 deletions
diff --git a/pyserial/serial/serialwin32.py b/pyserial/serial/serialwin32.py
index 8dfc26d..8c881b5 100644
--- a/pyserial/serial/serialwin32.py
+++ b/pyserial/serial/serialwin32.py
@@ -13,7 +13,6 @@ import win32
from serialutil import *
-
def device(portnum):
"""Turn a port number into a device name"""
return 'COM%d' % (portnum+1) #numbers are transformed to a string
@@ -36,17 +35,17 @@ class Serial(SerialBase):
port = self.portstr
if port.upper().startswith('COM') and int(port[3:]) > 8:
port = '\\\\.\\' + port
- try:
- self.hComPort = win32.CreateFile(port,
- win32.GENERIC_READ | win32.GENERIC_WRITE,
- 0, # exclusive access
- None, # no security
- win32.OPEN_EXISTING,
- win32.FILE_ATTRIBUTE_NORMAL | win32.FILE_FLAG_OVERLAPPED,
- 0)
- except Exception, msg:
+ self.hComPort = win32.CreateFile(port,
+ win32.GENERIC_READ | win32.GENERIC_WRITE,
+ 0, # exclusive access
+ None, # no security
+ win32.OPEN_EXISTING,
+ win32.FILE_ATTRIBUTE_NORMAL | win32.FILE_FLAG_OVERLAPPED,
+ 0)
+ if self.hComPort == win32.INVALID_HANDLE_VALUE:
self.hComPort = None #'cause __del__ is called anyway
- raise SerialException("could not open port %s: %s" % (self.portstr, msg))
+ raise SerialException("could not open port %s: %s" % (self.portstr, ctypes.WinError()))
+
# Setup a 4k buffer
win32.SetupComm(self.hComPort, 4096, 4096)
@@ -166,7 +165,7 @@ class Serial(SerialBase):
comDCB.XoffChar = XOFF
if not win32.SetCommState(self.hComPort, ctypes.byref(comDCB)):
- raise ValueError("Cannot configure port, some setting was wrong. Original message: %s" % e)
+ raise ValueError("Cannot configure port, some setting was wrong. Original message: %s" % ctypes.WinError())
#~ def __del__(self):
#~ self.close()
@@ -215,7 +214,7 @@ class Serial(SerialBase):
rc = win32.DWORD()
err = win32.ReadFile(self.hComPort, buf, size, ctypes.byref(rc), ctypes.byref(self._overlappedRead))
if not err and win32.GetLastError() != win32.ERROR_IO_PENDING:
- raise SerialException("ReadFile failed (%s)" % WinError())
+ raise SerialException("ReadFile failed (%s)" % ctypes.WinError())
err = win32.WaitForSingleObject(self._overlappedRead.hEvent, win32.INFINITE)
read = buf.raw[:rc.value]
else:
@@ -225,7 +224,7 @@ class Serial(SerialBase):
rc = win32.DWORD()
err = win32.ReadFile(self.hComPort, buf, size, ctypes.byref(rc), ctypes.byref(self._overlappedRead))
if not err and win32.GetLastError() != win32.ERROR_IO_PENDING:
- raise SerialException("ReadFile failed (%s)" % WinError())
+ raise SerialException("ReadFile failed (%s)" % ctypes.WinError())
err = win32.GetOverlappedResult(self.hComPort, ctypes.byref(self._overlappedRead), ctypes.byref(rc), True)
read = buf.raw[:rc.value]
else:
@@ -240,13 +239,13 @@ class Serial(SerialBase):
if data:
#~ win32event.ResetEvent(self._overlappedWrite.hEvent)
n = win32.DWORD()
- err = win32.WriteFile(self.hComPort, s, len(s), ctypes.byref(n), self._overlappedWrite)
+ err = win32.WriteFile(self.hComPort, data, len(data), ctypes.byref(n), self._overlappedWrite)
if not err and win32.GetLastError() != win32.ERROR_IO_PENDING:
- raise SerialException("WriteFile failed (%s)" % WinError())
+ raise SerialException("WriteFile failed (%s)" % ctypes.WinError())
# Wait for the write to complete.
#~ win32.WaitForSingleObject(self._overlappedWrite.hEvent, win32.INFINITE)
- win32.GetOverlappedResult(self.hComPort, self._overlappedWrite, ctypes.byref(n), True)
- if n != len(s):
+ err = win32.GetOverlappedResult(self.hComPort, self._overlappedWrite, ctypes.byref(n), True)
+ if n.value != len(data):
raise writeTimeoutError
@@ -281,20 +280,20 @@ class Serial(SerialBase):
"""Set terminal status line: Request To Send"""
if not self.hComPort: raise portNotOpenError
if level:
- self._rtsState = win32file.RTS_CONTROL_ENABLE
+ self._rtsState = win32.RTS_CONTROL_ENABLE
win32.EscapeCommFunction(self.hComPort, win32.SETRTS)
else:
- self._rtsState = win32file.RTS_CONTROL_DISABLE
+ self._rtsState = win32.RTS_CONTROL_DISABLE
win32.EscapeCommFunction(self.hComPort, win32.CLRRTS)
def setDTR(self, level=1):
"""Set terminal status line: Data Terminal Ready"""
if not self.hComPort: raise portNotOpenError
if level:
- self._dtrState = win32file.DTR_CONTROL_ENABLE
+ self._dtrState = win32.DTR_CONTROL_ENABLE
win32.EscapeCommFunction(self.hComPort, win32.SETDTR)
else:
- self._dtrState = win32file.DTR_CONTROL_DISABLE
+ self._dtrState = win32.DTR_CONTROL_DISABLE
win32.EscapeCommFunction(self.hComPort, win32.CLRDTR)
def _GetCommModemStatus(self):
diff --git a/pyserial/serial/win32.py b/pyserial/serial/win32.py
index 55dec16..9b8c118 100644
--- a/pyserial/serial/win32.py
+++ b/pyserial/serial/win32.py
@@ -8,6 +8,7 @@ from ctypes.wintypes import DWORD
from ctypes.wintypes import WORD
from ctypes.wintypes import BYTE
+INVALID_HANDLE_VALUE = HANDLE(-1).value
class _SECURITY_ATTRIBUTES(Structure):
pass
@@ -17,6 +18,7 @@ CreateEventW = _stdcall_libraries['kernel32'].CreateEventW
CreateEventW.restype = HANDLE
CreateEventW.argtypes = [LPSECURITY_ATTRIBUTES, BOOL, BOOL, LPCWSTR]
CreateEvent = CreateEventW # alias
+
CreateFileW = _stdcall_libraries['kernel32'].CreateFileW
CreateFileW.restype = HANDLE
CreateFileW.argtypes = [LPCWSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE]
@@ -123,6 +125,10 @@ SetCommTimeouts = _stdcall_libraries['kernel32'].SetCommTimeouts
SetCommTimeouts.restype = BOOL
SetCommTimeouts.argtypes = [HANDLE, LPCOMMTIMEOUTS]
+WaitForSingleObject = _stdcall_libraries['kernel32'].WaitForSingleObject
+WaitForSingleObject.restype = DWORD
+WaitForSingleObject.argtypes = [HANDLE, DWORD]
+
ONESTOPBIT = 0 # Variable c_int
TWOSTOPBITS = 2 # Variable c_int
ONE5STOPBITS = 1
@@ -133,6 +139,18 @@ EVENPARITY = 2 # Variable c_int
MARKPARITY = 3
SPACEPARITY = 4
+RTS_CONTROL_HANDSHAKE = 2 # Variable c_int
+RTS_CONTROL_DISABLE = 0 # Variable c_int
+RTS_CONTROL_ENABLE = 1 # Variable c_int
+SETRTS = 3
+CLRRTS = 4
+
+DTR_CONTROL_HANDSHAKE = 2 # Variable c_int
+DTR_CONTROL_DISABLE = 0 # Variable c_int
+DTR_CONTROL_ENABLE = 1 # Variable c_int
+SETDTR = 5
+CLRDTR = 6
+
MS_DSR_ON = 32 # Variable c_ulong
EV_RING = 256 # Variable c_int
EV_PERR = 512 # Variable c_int
@@ -148,19 +166,15 @@ EV_RLSD = 32 # Variable c_int
ERROR_IO_PENDING = 997 # Variable c_long
MS_CTS_ON = 16 # Variable c_ulong
EV_EVENT1 = 2048 # Variable c_int
-RTS_CONTROL_HANDSHAKE = 2 # Variable c_int
EV_RX80FULL = 1024 # Variable c_int
PURGE_RXABORT = 2 # Variable c_int
FILE_ATTRIBUTE_NORMAL = 128 # Variable c_int
PURGE_TXABORT = 1 # Variable c_int
SETXON = 2 # Variable c_int
OPEN_EXISTING = 3 # Variable c_int
-RTS_CONTROL_ENABLE = 1 # Variable c_int
MS_RING_ON = 64 # Variable c_ulong
EV_TXEMPTY = 4 # Variable c_int
EV_RXFLAG = 2 # Variable c_int
-DTR_CONTROL_HANDSHAKE = 2 # Variable c_int
-DTR_CONTROL_ENABLE = 1 # Variable c_int
MS_RLSD_ON = 128 # Variable c_ulong
GENERIC_READ = 2147483648L # Variable c_ulong
EV_EVENT2 = 4096 # Variable c_int
@@ -168,6 +182,7 @@ EV_CTS = 8 # Variable c_int
EV_BREAK = 64 # Variable c_int
PURGE_RXCLEAR = 8 # Variable c_int
ULONG_PTR = c_ulong
+INFINITE = 0xFFFFFFFFL
class N11_OVERLAPPED4DOLLAR_48E(Union):
pass