'Open port with current settings. This may throw a SerialException
if the port cannot be opened.'

def open(self):

    if (self._port is None):
        raise SerialException('Port    must    be    configured    before    it    can    be    used.')
    if self.is_open:
        raise SerialException('Port    is    already    open.')
    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, None, win32.OPEN_EXISTING, (win32.FILE_ATTRIBUTE_NORMAL | win32.FILE_FLAG_OVERLAPPED), 0)
    if (self._port_handle == win32.INVALID_HANDLE_VALUE):
        self._port_handle = None
        raise SerialException('could    not    open    port    {!r}:    {!r}'.format(self.portstr, ctypes.WinError()))
    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)
        win32.SetupComm(self._port_handle, 4096, 4096)
        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:
            pass
        self._port_handle = None
        raise
    else:
        self.is_open = True
