Структура передана по UART, на приёмнике поля разъезжаются
Устройство отправляет пакет телеметрии, передавая структуру как последовательность байт:
struct Packet {
uint8_t id;
uint32_t value;
uint16_t crc;
};
HAL_UART_Transmit(&huart1, (uint8_t *)&p, sizeof(p), 100);
На устройстве sizeof(struct Packet) равен 12. Приёмник на другой платформе ожидает 7 байт и разбирает поля неверно.
Что здесь происходит и как это чинить?
- uint32_t нельзя передавать по UART: интерфейс байтовый и разрезает 32-битные поля в произвольных местах, теряя выравнивание
- Компилятор добавил выравнивающие байты между полями; передавать нужно упакованное представление или сериализовать поля вручную
- Дело в порядке байт: обе стороны little-endian, но UART передаёт биты старшим вперёд, поэтому поля приходят перевёрнутыми
- sizeof на 32-битном ядре всегда возвращает 12 для любой структуры, поэтому нужно жёстко указать длину 7 байт при передаче
