def _read_settings(self, retry=True):
        """Read the information from the Hottop.

        Read the settings from the serial interface and convert them into a
        human-readable format that can be shared back to the end-user. Reading
        from the serial interface will occasionally produce strange results or
        blank reads, so a retry process has been built into the function as a
        recursive check.

        :returns: dict
        """
        if not self._conn.isOpen():
            self._log.debug("Reopening connection")
            self._conn.open()
        self._conn.flushInput()
        self._conn.flushOutput()
        buffer = self._conn.read(36)
        if len(buffer) != 36:
            self._log.debug('Buffer length (%d) did not match 36' % len(buffer))
            if self._conn.isOpen():
                self._log.debug('Closing connection')
                self._conn.close()
                self._read_settings(retry=True)

        try:
            check = self._validate_checksum(buffer)
        except:
            check = False

        if not check and (retry and self._retry_count <= 3):
            if self._retry_count == 3:
                self._log.error('Retry count reached on buffer check')
                self._read_settings(retry=False)
            else:
                self._retry_count += 1
                self._read_settings(retry=True)

        try:
            settings = dict()
            settings['heater'] = hex2int(buffer[10])
            settings['fan'] = hex2int(buffer[11])
            settings['main_fan'] = hex2int(buffer[12])
            et = hex2int(buffer[23] + buffer[24])
            settings['environment_temp'] = celsius2fahrenheit(et)
            bt = hex2int(buffer[25] + buffer[26])
            settings['bean_temp'] = celsius2fahrenheit(bt)
            settings['solenoid'] = hex2int(buffer[16])
            settings['drum_motor'] = hex2int(buffer[17])
            settings['cooling_motor'] = hex2int(buffer[18])
            settings['chaff_tray'] = hex2int(buffer[19])
            self._retry_count = 0
        except Exception:
            self._log.error("Pulled a cache configuration!")
            settings = self._generate_config()
        return settings