code: def _recv_internal(self, timeout):
          
          try:
              # ser.read can return an empty string
              # or raise a SerialException
              rx_byte = self.ser.read()
          except serial.SerialException:
              return None, False
  
          if rx_byte and ord(rx_byte) == 0xAA:
              s = bytearray(self.ser.read(4))
              timestamp = (struct.unpack('<I', s))[0]
              dlc = ord(self.ser.read())
  
              s = bytearray(self.ser.read(4))
              arb_id = (struct.unpack('<I', s))[0]
  
              data = self.ser.read(dlc)
  
              rxd_byte = ord(self.ser.read())
              if rxd_byte == 0xBB:
                  # received message data okay
                  msg = Message(timestamp=timestamp/1000,
                                arbitration_id=arb_id,
                                dlc=dlc,
                                data=data)
                  return msg, False
  
          else:
              return None, False
docs: Read a message from the serial device.
  
          :param timeout:
  
              .. warning::
                  This parameter will be ignored. The timeout value of the channel is used.
  
          :returns:
              Received message and False (because not filtering as taken place).
  
              .. warning::
                  Flags like is_extended_id, is_remote_frame and is_error_frame
                  will not be set over this function, the flags in the return
                  message are the default values.
  
          :rtype:
              can.Message, bool