联合体
程序员文章站
2022-07-12 23:11:08
...
#pragma pack(1)
typedef union {
struct {
struct
{
uint8_t ch0_h:8; //!< Byte 0
uint8_t ch0_l:3; //!< Byte 1
uint8_t ch1_h:5;
uint8_t ch1_l:6; //!< Byte 2
uint8_t ch2_h:2;
uint8_t ch2_m:8; //!< Byte 3
uint8_t ch2_l:1; //!< Byte 4
uint8_t ch3_h:7;
uint8_t ch3_l:4; //!< Byte 5
uint8_t s1:2;
uint8_t s2:2;
}rc;
struct
{
int16_t x; //!< Byte 6-7
int16_t y; //!< Byte 8-9
int16_t z; //!< Byte 10-11
uint8_t press_l; //!< Byte 12
uint8_t press_r; //!< Byte 13
}mouse;
struct
{
uint16_t v; //!< Byte 14-15
}key;
uint16_t resv; //!< Byte 16-17
};
uint8_t buf[18]; //!< Union --> Byte<0-17>
}RC_Ctl_Define_t;
上面的就是联合体(又称共用体)的实际例子
①定义方法:typedef union{ } test;
②使用关键点:(1)可以看到 uint8_t buf[18]; 这个数组里面存了之前的结构体变量的值。他们共用一片内存地址。比如buf[0]的值等于ch0_h的值;
③使用好处:单片机的底层,如51某些时候需要按位与或,故 uint8_t ch0_l:3;代表直接取高三位或者低三位,相当于省略了与的操作(高位数据还是低位数据要看平台的大小端模式,51是大端,stm32默认是小端)