протокола сделали нехорошее. Считается плохим тоном делать однобайтовые поля без выравнивания их по размерам, кратным 2 или 4. Вы можете получить структуру с данными из внешних источников, при этом она может быть произвольно упакована и не привязана к правилам вашего компилятора. Так вот в памяти она может находиться и по нечётному адресу и поля её также могут иметь нечётные смещения. Чтобы не применять всякие ухищрения, как с modbus rtu заголовками - делайте их "жирнее". Кстати, offsetof(), указанный ранее, не работает с битовыми полями, насколько я помню, т.е. смещение можно получить только для полей разных типов в структуре. Рекомендую выравнивать по 2, а лучше по 4 байта, а резервные биты описывать явно. Сам пользуюсь этим для доступа к битовым полям периферийных регистров процессора:
// SDRAM Refresh Control Register (SDRCR). typedef struct _SDRAM_REFRESH_CONTROL_REGISTER_FIELDS { // Refresh rate. Defines the rate at which the attached SDRAM devices will be refreshed. The // value of this field may be calculated with the following equation: // RR = SDRAM frequency/SDRAM refresh rate // where SDRAM refresh rate is derived from the SDRAM data sheet. uint32_t RR: 16; uint32_t Reserved1: 7; // Self-refresh or Power-down select. This bit is only in effect when the LPMODEN bit is set to 1; // this bit is ignored when the LPMODEN bit is cleared to 0. // 0 - Self-refresh mode; // 1 - Power-down mode. uint32_t SR_PD: 1; uint32_t Reserved2: 6; // MCLK stop enable. // 0 - Disables MCLK stopping, MCLK may not be stopped; // 1 - Enables MCLK stopping, MCLK may be stopped. The LPMODEN bit must be set to 1 before // setting the MCLKSTOPEN bit to 1. uint32_t MCLKSTOPEN: 1; // Low-power mode enable. // 0 - Disable low-power mode; // 1 - Enable low-power mode. The state of bit SR_PD selects either self-refresh or power-down mode. uint32_t LPMODEN: 1; } SDRAM_REFRESH_CONTROL_REGISTER_FIELDS, * PSDRAM_REFRESH_CONTROL_REGISTER_FIELDS; typedef union { uint32_t Value; SDRAM_REFRESH_CONTROL_REGISTER_FIELDS Fields; } SDRAM_REFRESH_CONTROL_REGISTER, * PSDRAM_REFRESH_CONTROL_REGISTER;
-
- Дополнять ещё можно так, опуская идентификатор поля. yни(414 знак., 25.02.2021 10:02)