Получение сообщения из шины (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
};
// 29-bit message identifier
#define FLAG_MESSAGE_EXTID 0x00000001U
// Remote frame
#define FLAG_MESSAGE_RTR 0x00000002U
// CAN-FD frame
#define FLAG_MESSAGE_FDF 0x00000004U
// CAN-FD bit rate switch
#define FLAG_MESSAGE_BRS 0x00000008U
// CAN-FD Error status indicator
#define FLAG_MESSAGE_ESI 0x00000010U
// LIN Master request
#define FLAG_MESSAGE_MR 0x00000100U
// LIN Slave response
#define FLAG_MESSAGE_SR 0x00000200U
// Classic CRC for LIN
#define FLAG_MESSAGE_CC 0x00001000U
// Enhanced CRC for LIN
#define FLAG_MESSAGE_EC 0x00002000U
// Error frame
#define FLAG_MESSAGE_EF 0x01000000U
// RX
#define FLAG_MESSAGE_RX 0x10000000U
// TX
#define FLAG_MESSAGE_TX 0x20000000U
typedef struct {
uint32_t flags; // флаги сообщения
uint32_t time; // время получения сообщения из шины в микросекундах по внутренним часам устройства
uint32_t crc; // предполагаемая контрольная сумма сообщения. используется для LIN. в остальных случаях не определено.
uint32_t msgID;
uint16_t dlc;
uint8_t data[64];
} __attribute__((packed)) BusMessage;
typedef struct {
MsgCommandHeader header;
BusMessage message;
} __attribute__((packed)) RcvMessage;
Если в поле message.dlc указывается длина передаваемых данных меньше 64 байт, то поле data может соответствовать количеству данных, указанных в message.dlc. Тогда header.dSize уменьшается на величину реально передаваемых данных.