Вопрос только для C, C ++ и векторы не решают проблему.
У меня есть такая структура:
typedef __packed struct Packet_s
{
U8 head;
U16 len;
U32 id;
U8 data;
U8 end;
U16 crc;
} Packet_t, *Packet_p;
( EDIT : U8 - это uint8_t (без знака)char) и т. д.)
Например, я получил пакет (в шестнадцатеричном формате):
24 0B 00 07 00 00 00 AA 0D 16 1C
где
голова = 0x24
len = 0x0B 0x00
id = 0x07 0x00 0x00 0x00
данные = 0xAA
end = 0x0D
crc = 0x16 0x1C
Я могу скопировать его из входного буфера вот так
U8 Buffer[SIZE]; // receives all bytes here
memcpy(&Packet, &Buffer, buffer_len);
и работать с ним дальше.
Можно ли использовать мою структуру, если поле "DATA" длиннее 1 байта?
Как я могу обработать что-то подобное?
24 0F 00 07 00 00 00 AA BB CC DD EE 0D BD 66
Длина пакета будет всегда известна (2 и 3 байта имеют информацию о длине).
РЕДАКТИРОВАТЬ: Под "ручкой" я имею в виду, что я хочу сделать следующее:
if (isCRCmatch() )
{
if(Packet.id == SPECIAL_ID_1)
{
// do something
}
if(Packet.id == SPECIAL_ID_2)
{
// do other
}
if(Packet.data[0] == 0xAA)
{
// do one stuff
}
if(Packet.data[1] == 0xBB && Packet.id == SPECIAL_ID_3 )
{
// do another stuff
}
}
А также(если возможно ofc) Я хотел бы отправить "anwers", используя ту же структуру:
U8 rspData[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
SendResponce(Packet.id, rspData);
void SendResponce (U8 id_rsp, uint8_t* data_rsp)
{
Packet_t ResponceData;
uint16_t crc;
uint8_t *data;
ResponceData.head = 0x24;
ResponceData.len = sizeof(ResponceData); // HERE IS PROBLEM ONE
ResponceData.id = id_rsp;
ResponceData.data = *data_rsp; // HERE IS PROBLEM TWO
ResponceData.end = 0x0D; // symbol '\r'
data = (uint8_t*)&ResponceData;
crc = GetCrc(data, sizeof(ResponceData)-2); // last 2 bytes with crc
ResponceData.crc = crc;//(ack_crc >> 8 | ack_crc);
SendData((U8*)&ResponceData, sizeof(ResponceData)); // Send rsp packet
}
Первая проблема - я не могу получить размер всей структуры автоматически, так как указатель всегда будет 4 байта ... Вторая проблема- Я уверен, что потеряю данные rsp, так как не знаю, где их конец.