Как прокомментировал Камил Цук, ваши два предложения почти одинаковы с некоторой возможной разницей в скорости.
Другой вариант - использовать объединение:
typedef struct {
uint8_t ck_a;
uint8_t ck_b;
} UBXChecksum_t ;
union convert {
UBXChecksum_t checksum;
char buffer[sizeof UBXChecksum_t];
};
UBXChecksum_t checksum;
union convert converter;
converter.checksum = checksum;
passArrayToSomeFunction(converter.buffer, sizeof(converter.buffer));
У вас нетскопировать данные, чтобы преобразовать их в массив.Вы можете передать указатель на структуру (при необходимости приведенную к char*
или void*
) и размер структуры в функцию, которая отправляет данные на последовательный порт.Пример:
typedef struct {
uint8_t ck_a;
uint8_t ck_b;
} UBXChecksum_t ;
int sendData(void *buf, size_t size);
UBXChecksum_t checksum;
/* ... */
int rc = sendData(&checksum, sizeof(checksum));
Все эти варианты отправляют внутреннее представление структуры в виде двоичных данных.Обычно «сериализация» понимается как способ преобразования данных в независимый от платформы формат.
Отправка двоичных структур данных работает, если принимающая система имеет тот же тип и использует тот же компилятор.Могут возникнуть проблемы, когда принимающая система использует другой порядок байтов или разные размеры типов данных.
В вашем случае у вас есть структура из двух значений uint8_t
, поэтому размер является фиксированным, и порядок следования байтов не является проблемой.
Можно отправлять двоичные данные, если требуетсяпоскольку структура должна соответствовать указанному протоколу двоичных данных, и вы готовы обработать порядок байтов, если это необходимо.