Проект

Общее

Профиль

Получение сообщения из шины (COMMAND_MESSAGE 0x40)

Получение данных из шины происходит с использованием следующих структур:

enum FLAG_MESSAGE_CHANNELS {
    FLAG_MESSAGE_CHANNEL_1 = 0x2000,
    FLAG_MESSAGE_CHANNEL_2 = 0x4000,
    FLAG_MESSAGE_CHANNEL_3 = 0x6000,
    FLAG_MESSAGE_CHANNEL_4 = 0x8000,
    FLAG_MESSAGE_CHANNEL_5 = 0xA000,
    FLAG_MESSAGE_CHANNEL_6 = 0xC000,
    FLAG_MESSAGE_CHANNEL_7 = 0xE000
};

// CAN 29-bit message identifier
#define FLAG_MESSAGE_EXTID              0x0800U
// CAN Remote frame
#define FLAG_MESSAGE_RTR                0x0400U
// Error frame for CAN
#define FLAG_MESSAGE_EF                 0x0080U

// LIN Master request
#define FLAG_MESSAGE_MR                 0x0400U
// LIN Slave response
#define FLAG_MESSAGE_SR                 0x0200U

typedef struct {
    uint32_t time;    // время получения сообщения из шины в микросекундах по внутренним часам устройства
    uint32_t crc;     // предполагаемая контрольная сумма сообщения. используется для LIN. в остальных случаях не определено.
    uint32_t msgID;
    uint8_t dlc;
    uint8_t data[8];
} __attribute__((packed)) BusMessage;

typedef struct {
    MsgCommandHeader header;
    BusMessage message;
} __attribute__((packed)) RcvMessage;

Если в поле message.dlc указывается длина передаваемых данных меньше 8 байт, то поле data может соответствовать количеству данных, указанных в message.dlc. Тогда header.dSize уменьшается на величину реально передаваемых данных.