summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcliechti <cliechti@f19166aa-fa4f-0410-85c2-fa1106f25c8a>2003-07-12 23:41:43 +0000
committercliechti <cliechti@f19166aa-fa4f-0410-85c2-fa1106f25c8a>2003-07-12 23:41:43 +0000
commitf622fafe7eb2acf6e21fc715ca9999a55dc5c492 (patch)
treefe5980c838e7ac6286df2976ad026eac3917d8ca
parente7d23fe04519ed219a6aace4aa01985cdc4e636d (diff)
downloadpyserial-git-f622fafe7eb2acf6e21fc715ca9999a55dc5c492.tar.gz
dont recreate opverlaped structures and events on each read/write
dont set unneded event masks
-rw-r--r--pyserial/serial/serialwin32.py60
1 files changed, 25 insertions, 35 deletions
diff --git a/pyserial/serial/serialwin32.py b/pyserial/serial/serialwin32.py
index a69c4f5..5922827 100644
--- a/pyserial/serial/serialwin32.py
+++ b/pyserial/serial/serialwin32.py
@@ -11,7 +11,7 @@ import win32con # constants.
import sys, string
import serialutil
-VERSION = string.split("$Revision: 1.20 $")[1] #extract CVS version
+VERSION = string.split("$Revision: 1.21 $")[1] #extract CVS version
PARITY_NONE, PARITY_EVEN, PARITY_ODD = range(3)
STOPBITS_ONE, STOPBITS_TWO = (1, 2)
@@ -87,9 +87,9 @@ class Serial(serialutil.FileLike):
#win32file.SetCommMask(self.hComPort, win32file.EV_RXCHAR | win32file.EV_TXEMPTY |
# win32file.EV_RXFLAG | win32file.EV_ERR)
- win32file.SetCommMask(self.hComPort,
- win32file.EV_RXCHAR | win32file.EV_RXFLAG | win32file.EV_ERR)
- #win32file.SetCommMask(self.hComPort, win32file.EV_ERR)
+ #~ win32file.SetCommMask(self.hComPort,
+ #~ win32file.EV_RXCHAR | win32file.EV_RXFLAG | win32file.EV_ERR)
+ win32file.SetCommMask(self.hComPort, win32file.EV_ERR)
# Setup the connection info.
# Get state and modify it:
@@ -145,8 +145,10 @@ class Serial(serialutil.FileLike):
#print win32file.ClearCommError(self.hComPort) #flags, comState =
- #self.overlapped = win32file.OVERLAPPED()
- #self.overlapped.hEvent = win32event.CreateEvent(None, 0, 0, None)
+ self._overlappedRead = win32file.OVERLAPPED()
+ self._overlappedRead.hEvent = win32event.CreateEvent(None, 1, 0, None)
+ self._overlappedWrite = win32file.OVERLAPPED()
+ self._overlappedWrite.hEvent = win32event.CreateEvent(None, 0, 0, None)
def __del__(self):
self.close()
@@ -154,18 +156,6 @@ class Serial(serialutil.FileLike):
def close(self):
"""close port"""
if self.hComPort:
- #Wait until data is transmitted, but not too long... (Timeout-Time)
- #while 1:
- # flags, comState = win32file.ClearCommError(hComPort)
- # if comState.cbOutQue <= 0 or calcTimeout(startTime) > timeout:
- # break
-
- #~ self.setRTS(0) #causes problem if HW handshake is enabled
- #~ self.setDTR(0)
- #Clear buffers:
- win32file.PurgeComm(self.hComPort,
- win32file.PURGE_TXCLEAR | win32file.PURGE_TXABORT |
- win32file.PURGE_RXCLEAR | win32file.PURGE_RXABORT)
#Restore original timeout values:
win32file.SetCommTimeouts(self.hComPort, self.orgTimeouts)
#Close COM-Port:
@@ -187,36 +177,36 @@ class Serial(serialutil.FileLike):
return comstat.cbInQue
def read(self, size=1):
- "read num bytes from serial port"
+ """read num bytes from serial port"""
if not self.hComPort: raise portNotOpenError
- read = ''
if size > 0:
- overlapped = win32file.OVERLAPPED()
- overlapped.hEvent = win32event.CreateEvent(None, 1, 0, None)
+ win32event.ResetEvent(self._overlappedRead.hEvent)
+ flags, comstat = win32file.ClearCommError(self.hComPort)
if self.timeout == 0:
- flags, comstat = win32file.ClearCommError(self.hComPort)
n = min(comstat.cbInQue, size)
if n > 0:
- rc, buf = win32file.ReadFile(self.hComPort, win32file.AllocateReadBuffer(n), overlapped)
- win32event.WaitForSingleObject(overlapped.hEvent, win32event.INFINITE)
+ rc, buf = win32file.ReadFile(self.hComPort, win32file.AllocateReadBuffer(n), self._overlappedRead)
+ win32event.WaitForSingleObject(self._overlappedRead.hEvent, win32event.INFINITE)
read = str(buf)
+ else:
+ read = ''
else:
- flags, comstat = win32file.ClearCommError(self.hComPort)
- rc, buf = win32file.ReadFile(self.hComPort, win32file.AllocateReadBuffer(size), overlapped)
- n = win32file.GetOverlappedResult(self.hComPort, overlapped, 1)
+ rc, buf = win32file.ReadFile(self.hComPort, win32file.AllocateReadBuffer(size), self._overlappedRead)
+ n = win32file.GetOverlappedResult(self.hComPort, self._overlappedRead, 1)
read = str(buf[:n])
+ else:
+ read = ''
return read
def write(self, s):
- "write string to serial port"
+ """write string to serial port"""
if not self.hComPort: raise portNotOpenError
#print repr(s),
- overlapped = win32file.OVERLAPPED()
- overlapped.hEvent = win32event.CreateEvent(None, 1, 0, None)
- err, n = win32file.WriteFile(self.hComPort, s, overlapped)
- if err: #will be ERROR_IO_PENDING:
- # Wait for the write to complete.
- win32event.WaitForSingleObject(overlapped.hEvent, win32event.INFINITE)
+ if s:
+ err, n = win32file.WriteFile(self.hComPort, s, self._overlappedWrite)
+ if err: #will be ERROR_IO_PENDING:
+ # Wait for the write to complete.
+ win32event.WaitForSingleObject(self._overlappedWrite.hEvent, win32event.INFINITE)
def flushInput(self):
if not self.hComPort: raise portNotOpenError