def connect_direct(self, connection_string, no_rpc=False, force=False):
        """Directly connect to a device using its stream specific connection string.

        Normally, all connections to a device include opening the RPC
        interface to send RPCs.  However, there are certain, very specific,
        circumstances when you would not want to or be able to open the RPC
        interface (such as when you are using the debug interface on a bare
        MCU that has not been programmed yet).  In those cases you can pass
        no_rpc=True to not attempt to open the RPC interface.  If you do not
        open the RPC interface at connection time, there is no public
        interface to open it later, so you must disconnect and reconnect to
        the device in order to open the interface.

        Args:
            connection_string (str): The connection string that identifies the desired device.
            no_rpc (bool): Do not open the RPC interface on the device (default=False).
            force (bool): Whether to force another connection even if we think we are currently
                connected.  This is for internal use and not designed to be set externally.
        """

        if not force and self.connected:
            raise HardwareError("Cannot connect when we are already connected to '%s'" % self.connection_string)

        self._loop.run_coroutine(self.adapter.connect(0, connection_string))

        try:
            if no_rpc:
                self._logger.info("Not opening RPC interface on device %s", self.connection_string)
            else:
                self._loop.run_coroutine(self.adapter.open_interface(0, 'rpc'))
        except HardwareError as exc:
            self._logger.exception("Error opening RPC interface on device %s", connection_string)
            self._loop.run_coroutine(self.adapter.disconnect(0))
            raise exc
        except Exception as exc:
            self._logger.exception("Error opening RPC interface on device %s", connection_string)
            self._loop.run_coroutine(self.adapter.disconnect(0))
            raise HardwareError("Could not open RPC interface on device due to an exception: %s" % str(exc)) from exc

        self.connected = True
        self.connection_string = connection_string
        self.connection_interrupted = False
Directly connect to a device using its stream specific connection string.

        Normally, all connections to a device include opening the RPC
        interface to send RPCs.  However, there are certain, very specific,
        circumstances when you would not want to or be able to open the RPC
        interface (such as when you are using the debug interface on a bare
        MCU that has not been programmed yet).  In those cases you can pass
        no_rpc=True to not attempt to open the RPC interface.  If you do not
        open the RPC interface at connection time, there is no public
        interface to open it later, so you must disconnect and reconnect to
        the device in order to open the interface.

        Args:
            connection_string (str): The connection string that identifies the desired device.
            no_rpc (bool): Do not open the RPC interface on the device (default=False).
            force (bool): Whether to force another connection even if we think we are currently
                connected.  This is for internal use and not designed to be set externally.