def open(self): """Open port with current settings. This may throw a SerialException if the port cannot be opened.""" if self._port is None: raise SerialException("Port must be configured before it can be used.") if self._isOpen: raise SerialException("Port is already open.") # the "\\.\COMx" format is required for devices other than COM1-COM8 # not all versions of windows seem to support this properly # so that the first few ports are used with the DOS presentation.device name port = self.portstr try: if port.upper().startswith('COM') and int(port[3:]) > 8: port = '\\\\.\\' + port except ValueError: # for like COMnotanumber pass 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 %r: %r" % (self.portstr, ctypes.WinError())) try: self._overlappedRead = win32.OVERLAPPED() self._overlappedRead.hEvent = win32.CreateEvent(None, 1, 0, None) self._overlappedWrite = win32.OVERLAPPED() #~ self._overlappedWrite.hEvent = win32.CreateEvent(None, 1, 0, None) self._overlappedWrite.hEvent = win32.CreateEvent(None, 0, 0, None) # Setup a 4k buffer win32.SetupComm(self.hComPort, 4096, 4096) # Save original timeout values: self._orgTimeouts = win32.COMMTIMEOUTS() win32.GetCommTimeouts(self.hComPort, ctypes.byref(self._orgTimeouts)) self._reconfigurePort() # Clear buffers: # Remove anything that was there win32.PurgeComm(self.hComPort, win32.PURGE_TXCLEAR | win32.PURGE_TXABORT | win32.PURGE_RXCLEAR | win32.PURGE_RXABORT) except: try: self._close() except: # ignore any exception when closing the port # also to keep original exception that happened when setting up pass self.hComPort = None raise else: self._isOpen = True
def open(self): if self._port is None: print("ERROR: Port must be configured before it can be used.") exit(1) if self.is_open: print("ERROR: Port is already opened.") exit(1) port = self.name try: if port.upper().startswith('COM') and int(port[3:]) > 8: port = '\\\\.\\' + port except ValueError: pass self._port_handle = 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) """ Bad COM port """ if self._port_handle == win32.INVALID_HANDLE_VALUE: self._port_handle = None print("ERROR: Could not open port {}".format(self.port)) exit(1) try: self._overlapped_read = win32.OVERLAPPED() self._overlapped_read.hEvent = win32.CreateEvent(None, 1, 0, None) self._overlapped_write = win32.OVERLAPPED() self._overlapped_write.hEvent = win32.CreateEvent(None, 0, 0, None) # Setup a 4k buffer win32.SetupComm(self._port_handle, 4096, 4096) # Save original timeout values: self._orgTimeouts = win32.COMMTIMEOUTS() win32.GetCommTimeouts(self._port_handle, ctypes.byref(self._orgTimeouts)) self._reconfigure_port() win32.PurgeComm( self._port_handle, win32.PURGE_TXCLEAR | win32.PURGE_TXABORT | win32.PURGE_RXCLEAR | win32.PURGE_RXABORT) except: try: self._close() except: # ignore any exception when closing the port # also to keep original exception that happened when setting up pass self._port_handle = None raise else: self.is_open = True
def reset_output_buffer(self): """\ Clear output buffer, aborting the current output and discarding all that is in the buffer. """ if not self._port_handle: raise portNotOpenError win32.PurgeComm(self._port_handle, win32.PURGE_TXCLEAR | win32.PURGE_TXABORT)
def flushOutput(self): """\ Clear output buffer, aborting the current output and discarding all that is in the buffer. """ if not self.hComPort: raise portNotOpenError win32.PurgeComm(self.hComPort, win32.PURGE_TXCLEAR | win32.PURGE_TXABORT)
def run_command(port, message, gsioc_id=61): to_write = (128 + gsioc_id).to_bytes(1, byteorder='big') LOGGER.info("id: {}, message: {}".format(gsioc_id, message)) LOGGER.debug("w: {}".format(to_write)) port.write(to_write) LOGGER.debug("r: {}".format(port.read(1))) win32.PurgeComm(port._port_handle, win32.PURGE_RXCLEAR) if len(message) > 1: to_write = b"\x0a" LOGGER.debug("w: {}".format(to_write)) port.write(b"\x0a") LOGGER.debug("r: {}".format(port.read(1))) win32.PurgeComm(port._port_handle, win32.PURGE_RXCLEAR) for letter in message: LOGGER.debug("w: {}".format(letter.to_bytes(1, byteorder='big'))) port.write(letter.to_bytes(1, byteorder='big')) LOGGER.debug("r: {}".format(port.read(1))) win32.PurgeComm(port._port_handle, win32.PURGE_RXCLEAR) if len(message) > 1: to_write = b"\x0d" LOGGER.debug("w: {}".format(to_write)) port.write(to_write) LOGGER.debug("r: {}".format(port.read(1))) win32.PurgeComm(port._port_handle, win32.PURGE_RXCLEAR) while True: rep = port.read(1) if not rep: break rep = rep[0] LOGGER.debug("r: {}".format(rep.to_bytes(1, byteorder="big"))) win32.PurgeComm(port._port_handle, win32.PURGE_RXCLEAR) to_write = b"\x06" LOGGER.debug("w: {}".format(to_write)) port.write(to_write) if rep > 127: LOGGER.debug("break") break
def _reconfigure_port(self): super(HandleSerial, self)._reconfigure_port() comDCB = win32.DCB() win32.GetCommState(self._port_handle, ctypes.byref(comDCB)) comDCB.fOutxCtsFlow = 0 comDCB.fOutxDsrFlow = 0 if not win32.SetCommState(self._port_handle, ctypes.byref(comDCB)): raise serial.SerialException( "Cannot configure port, something went wrong. " "Original message: {!r}".format(ctypes.WinError()) ) win32.PurgeComm(self._port_handle, win32.PURGE_RXCLEAR)
def reset_input_buffer(self): """Clear input buffer, discarding all that is in the buffer.""" if not self.is_open: raise portNotOpenError win32.PurgeComm(self._port_handle, win32.PURGE_RXCLEAR | win32.PURGE_RXABORT)
def flushInput(self): """Clear input buffer, discarding all that is in the buffer.""" if not self.hComPort: raise portNotOpenError win32.PurgeComm(self.hComPort, win32.PURGE_RXCLEAR | win32.PURGE_RXABORT)
#~ self._overlapped_write.hEvent = win32.CreateEvent(None, 1, 0, None) self._overlapped_write.hEvent = win32.CreateEvent(None, 0, 0, None) # Setup a 4k buffer win32.SetupComm(self._port_handle, 4096, 4096) # Save original timeout values: self._orgTimeouts = win32.COMMTIMEOUTS() win32.GetCommTimeouts(self._port_handle, ctypes.byref(self._orgTimeouts)) self._reconfigure_port() # Clear buffers: # Remove anything that was there win32.PurgeComm( self._port_handle, win32.PURGE_TXCLEAR | win32.PURGE_TXABORT | win32.PURGE_RXCLEAR | win32.PURGE_RXABORT) except: try: self._close() except: # ignore any exception when closing the port # also to keep original exception that happened when setting up pass self._port_handle = None raise else: self.is_open = True def _reconfigure_port(self): """Set communication parameters on opened port."""