Вступить в клуб →
средняявопросМикроконтроллеры и аппаратные протоколы

Структура передана по 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 байт при передаче

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела