def METHOD_NAME(self):
    "NB! works in background thread"
    try:
        data = b""
        while not self._reader_stopped:
            data += self._serial.read(1)  # To avoid busy loop
            if len(data) == 0:
                self._error = "EOF"
                # print("LISTEN EOFFFFFFFFFF")
                break
            data += self._serial.read_all()
            # logger.debug("GOT %r", data)
            if data.endswith(OUTPUT_ENQ) and self.text_mode:
                # Flow control.
                logger.debug("Read ENQ, responding with ACK")
                # Assuming connection is idle and it is safe to write in this thread
                self._serial.write(OUTPUT_ACK)
                self._serial.flush()
                data = data[:-1]
                continue
            # don't publish incomplete utf-8 data
            try:
                if self.text_mode:
                    data.decode("utf-8")  # testing if data decodes
                to_be_published = data
                data = b""
            except UnicodeDecodeError as e:
                if e.start == 0:
                    # Invalid start byte, ie. we have missed first byte(s) of the codepoint.
                    # No use of waiting, output everything
                    to_be_published = data
                    data = b""
                else:
                    to_be_published = data[: e.start]
                    data = data[e.start :]
            if to_be_published:
                self._make_output_available(to_be_published)
    except Exception as e:
        self._error = str(e)