code: def swo_read(self, offset, num_bytes, remove=False):
          
          buf_size = ctypes.c_uint32(num_bytes)
          buf = (ctypes.c_uint8 * num_bytes)(0)
  
          self._dll.JLINKARM_SWO_Read(buf, offset, ctypes.byref(buf_size))
  
          # After the call, ``buf_size`` has been modified to be the actual
          # number of bytes that was read.
          buf_size = buf_size.value
  
          if remove:
              self.swo_flush(buf_size)
  
          return list(buf)[:buf_size]
docs: Reads data from the SWO buffer.
  
          The data read is not automatically removed from the SWO buffer after
          reading unless ``remove`` is ``True``.  Otherwise the callee must
          explicitly remove the data by calling ``.swo_flush()``.
  
          Args:
            self (JLink): the ``JLink`` instance
            offset (int): offset of first byte to be retrieved
            num_bytes (int): number of bytes to read
            remove (bool): if data should be removed from buffer after read
  
          Returns:
            A list of bytes read from the SWO buffer.