code: def _receive(self):
          
          # preamble - not readall(1) to allow breaking before messages,
          # empty input
          preamble = self._read(1)
          if not preamble:
              return None
          elif ord(preamble) != SBP_PREAMBLE:
              if self._verbose:
                  print("Host Side Unhandled byte: 0x%02x" % ord(preamble))
              return None
          # hdr
          hdr = self._readall(5)
          msg_crc = crc16(hdr)
          msg_type, sender, msg_len = struct.unpack("<HHB", hdr)
          # data
          data = self._readall(msg_len)
          msg_crc = crc16(data, msg_crc)
          # crc
          crc = self._readall(2)
          crc, = struct.unpack("<H", crc)
          if crc != msg_crc:
              if self._verbose:
                  print("crc mismatch: 0x%04X 0x%04X" % (msg_crc, crc))
              return None
          msg = SBP(msg_type, sender, msg_len, data, crc)
          try:
              msg = self._dispatch(msg)
          except Exception as exc:
              warnings.warn("SBP dispatch error: %s" % (exc,))
          return msg
docs: Read and build SBP message.