Используя ответ на свой предыдущий вопрос из здесь , вы можете использовать это битовое поле в сочетании с простым uint8_t [64]
. Например
typedef struct
{
uint8_t data[64];
can_received_t received;
} msg_t;
Заполните данные по мере их поступления, записав их в соответствующие байты данных, затем установите бит, чтобы указать, что сообщение было получено частично. Структура не считается завершенной, пока вы не получите все части.
Очередь / FIFO выполняет только одну цель: отложить выполнение чего-либо до более позднего времени, когда будет больше времени. Нет причин делать это здесь. Ваше декодирование CAN сообщения может выглядеть примерно так:
msg_t msg;
switch(received_can_id)
{
...
case CANID_FOO:
memcpy(&msg.data[FOO_INDEX], rec_data, FOO_SIZE);
msg.received |= RECEIVED_FOO;
break;
case CANID_BAR:
memcpy(&msg.data[BAR_INDEX], rec_data, BAR_SIZE);
msg.received |= RECEIVED_BAR;
break;
...
}
if(msg.received == RECEIVED_ALL)
{
use(&msg); // do something
memset(&msg, 0, sizeof msg); // reset everything
}
Это довольно быстрый код, не нужно ничего ставить в очередь.