def read(self):
        """
        Reads a single character from the device.

        :returns: character read from the device
        :raises: :py:class:`~alarmdecoder.util.CommError`
        """
        data = ''

        try:
            read_ready, _, _ = select.select([self._device.fileno()], [], [], 0.5)

            if len(read_ready) != 0:
                data = self._device.read(1)

        except serial.SerialException as err:
            raise CommError('Error reading from device: {0}'.format(str(err)), err)

        return data.decode('utf-8')