Код
typedef union{
uint8_t raw[4]; // head, bodyA, bodyB, tail
struct{
uint8_t head;
uint8_t bodyA;
uint8_t bodyB;
uint8_t tail;
} body;
} my_t;
union делает так, что cтруктура body и массив raw размещаются в одном и том же куске памяти.
поэтому my_t.body.head будет совпадать с my_t.raw[0],
а my_t.body.bodyA будет совпадать с my_t.raw[1]
Но так просто только пока у Вас типы uint8_t, потому что компилятор вообще-то не гарантирует размещение полей структуры разного размера строго друг за другом.
В общем случае придётся прибегнуть к упакованным структурам (#pragma pack(1) для IAR).
Если компилятор понимает анонимные структуры, то можно
сделать проще.
Russia est omnis divisa in partes octo.