示例#1
0
 def read(self, size=1):
     """\
     Read size bytes from the serial port. If a timeout is set it may
     return less characters as requested. With no timeout it will block
     until the requested number of bytes is read."""
     if not self._port_handle:
         raise portNotOpenError
     if size > 0:
         win32.ResetEvent(self._overlapped_read.hEvent)
         flags = win32.DWORD()
         comstat = win32.COMSTAT()
         if not win32.ClearCommError(self._port_handle, ctypes.byref(flags),
                                     ctypes.byref(comstat)):
             raise SerialException('call to ClearCommError failed')
         if self.timeout == 0:
             n = min(comstat.cbInQue, size)
             if n > 0:
                 buf = ctypes.create_string_buffer(n)
                 rc = win32.DWORD()
                 read_ok = win32.ReadFile(
                     self._port_handle, buf, n, ctypes.byref(rc),
                     ctypes.byref(self._overlapped_read))
                 if not read_ok and win32.GetLastError() not in (
                         win32.ERROR_SUCCESS, win32.ERROR_IO_PENDING):
                     raise SerialException("ReadFile failed (%r)" %
                                           ctypes.WinError())
                 win32.GetOverlappedResult(
                     self._port_handle, ctypes.byref(self._overlapped_read),
                     ctypes.byref(rc), True)
                 read = buf.raw[:rc.value]
             else:
                 read = bytes()
         else:
             buf = ctypes.create_string_buffer(size)
             rc = win32.DWORD()
             read_ok = win32.ReadFile(self._port_handle, buf, size,
                                      ctypes.byref(rc),
                                      ctypes.byref(self._overlapped_read))
             if not read_ok and win32.GetLastError() not in (
                     win32.ERROR_SUCCESS, win32.ERROR_IO_PENDING):
                 raise SerialException("ReadFile failed (%r)" %
                                       ctypes.WinError())
             win32.GetOverlappedResult(self._port_handle,
                                       ctypes.byref(self._overlapped_read),
                                       ctypes.byref(rc), True)
             read = buf.raw[:rc.value]
     else:
         read = bytes()
     return bytes(read)
示例#2
0
 def write(self, data):
     """Output the given byte string over the serial port."""
     if not self._port_handle:
         raise portNotOpenError
     #~ if not isinstance(data, (bytes, bytearray)):
     #~ raise TypeError('expected %s or bytearray, got %s' % (bytes, type(data)))
     # convert data (needed in case of memoryview instance: Py 3.1 io lib), ctypes doesn't like memoryview
     data = to_bytes(data)
     if data:
         #~ win32event.ResetEvent(self._overlapped_write.hEvent)
         n = win32.DWORD()
         err = win32.WriteFile(self._port_handle, data, len(data),
                               ctypes.byref(n), self._overlapped_write)
         if not err and win32.GetLastError() != win32.ERROR_IO_PENDING:
             raise SerialException("WriteFile failed (%r)" %
                                   ctypes.WinError())
         if self._write_timeout != 0:  # if blocking (None) or w/ write timeout (>0)
             # 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 n.value != len(data):
                 raise writeTimeoutError
         return n.value
     else:
         return 0
示例#3
0
 def out_waiting(self):
     """Return how many bytes the in the outgoing buffer"""
     flags = win32.DWORD()
     comstat = win32.COMSTAT()
     if not win32.ClearCommError(self._port_handle, ctypes.byref(flags),
                                 ctypes.byref(comstat)):
         raise SerialException('call to ClearCommError failed')
     return comstat.cbOutQue
示例#4
0
 def in_waiting(self):
     """Return the number of bytes currently in the input buffer."""
     flags = win32.DWORD()
     comstat = win32.COMSTAT()
     if not win32.ClearCommError(self._port_handle, ctypes.byref(flags),
                                 ctypes.byref(comstat)):
         raise SerialException('call to ClearCommError failed')
     return comstat.cbInQue
示例#5
0
 def _GetCommModemStatus(self):
     if not self._port_handle:
         raise portNotOpenError
     stat = win32.DWORD()
     win32.GetCommModemStatus(self._port_handle, ctypes.byref(stat))
     return stat.value