arduino 的union数据测试

void setup()

{

union {
struct{uint8_t a1;uint16_t a2;uint32_t a3;uint8_t a4;uint16_t a5;}bak;
struct{uint16_t b1;uint32_t b2;uint8_t b3;uint32_t b4;}rec;
uint8_t b[26]={0,1,2,3,4,5,6,7,8,9,10};
}dev;

 


Serial.begin(115200);

Serial.print("TEST:\t");

Serial.print("a1:");Serial.println(dev.bak.a1, HEX);

Serial.print("a2:");Serial.println(dev.bak.a2, HEX);
Serial.print("a3:");Serial.println(dev.bak.a3, HEX);
Serial.print("a4:");Serial.println(dev.bak.a4, HEX);
Serial.print("a5:");Serial.println(dev.bak.a5, HEX);
Serial.print("b1:");Serial.println(dev.rec.b1, HEX);
Serial.print("b2:");Serial.println(dev.rec.b2, HEX);
Serial.print("b3:");Serial.println(dev.rec.b3, HEX);
Serial.print("b4:");Serial.println(dev.rec.b4, HEX);

Serial.println("\n\nDone...");

}


void loop()
{
}

运行结果:

16:10:06.598 -> a1:0


16:10:06.598 -> a2:302


16:10:06.598 -> a3:7060504


16:10:06.598 -> a4:8


16:10:06.598 -> a5:A


16:10:06.598 -> b1:100


16:10:06.598 -> b2:7060504


16:10:06.598 -> b3:8


16:10:06.598 -> b4:0

 

结论:Arduino的union的是依数据类型分组进行,uint8_t是一个字节一组,uint16_t是两个字节一组,uint32_t是四个字节一组,每种数据排列是固定的。

上例中union的11个数据{0,1,2,3,4,5,6,7,8,9,10}

对应uint8_t依次是(HEX) 0,1,2,3,4,5,6,7,8,9,a;

对应uint16_t依次是(HEX) 0100,0302,0504,0706,0908,000a;

 对应uint32_t依次是(HEX) 03020100,07060504,000a0908;
 所以不同类型混排时有数据空洞,比如a1和a2间的数据1;a3和a4间的数据9;b1和b2间的数据2和3都是数据空洞。
多字节数据高位在后。

 

posted @ 2022-08-01 16:43  chengwh  阅读(278)  评论(0)    收藏  举报