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
Beispiel #2
0
    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
Beispiel #3
0
 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)
Beispiel #4
0
 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)
Beispiel #5
0
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
Beispiel #6
0
    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)
Beispiel #7
0
 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)
Beispiel #8
0
 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)
Beispiel #9
0
            #~ 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."""