Отправить сообщение в шину (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
// Confirm required
#define FLAG_MESSAGE_CONFIRM_REQUIRED 0x0001U
typedef struct {
uint32_t msgID;
uint8_t dlc;
uint8_t data[8];
} __attribute__((packed)) ToBusMessage;
typedef struct {
MsgCommandHeader header;
ToBusMessage message;
} __attribute__((packed)) SendMessage;
Если в поле message.dlc указывается длина передаваемых данных меньше 8 байт, то поле data может соответствовать количеству данных, указанных в message.dlc. Тогда header.dSize уменьшается на величину реально передаваемых данных.
Запрос
Поле | Значение |
header.command | 0x40 |
header.sequence | порядковый номер запроса |
header.flags | FLAG_MESSAGE_CHANNEL_x + FLAG_MESSAGE_xxxx |
header.dSize | 0x0D |
message.msgID | идентификатор отправляемого сообщения |
message.dlc | размер передаваемых данных в шину |
message.data | данные, передаваемые в шину |
Ответ
Если выставлен флаг FLAG_MESSAGE_CONFIRM_REQUIRED и запрос успешно обработан.
Поле | Значение |
command | 0xC0 |
sequence | порядковый номер запроса |
flags | 0x00 |
dSize | 0x00 |
Если запрос не обработан.
Поле | Значение |
command | 0xFF |
sequence | порядковый номер запроса |
flags | 0x00 |
dSize | 0x00 |
Пример
Передача 4 байт данных в шину с 29 битным идентификатором сообщения 0x1FF00000.
⇒ 40 xx 28 00 00 09 1F F0 00 00 04 00 00 07 F0
Передача RTR запроса в шину с 11 битным идентификатором сообщения 0x2FF.
⇒ 40 xx 24 00 00 05 00 00 02 FF 04