Получение сообщения из шины (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 уменьшается на величину реально передаваемых данных.