最近在学习arduino单片机与上位机之间的数据传输,利用温湿度传感器测得温湿度信息以后通过串口发送至上位机程序进行存储。对于float类型,利用Serial.print(float)
函数在串口监视器上可以方便显示,但也破坏了数据结构,而利用Serial.write(char[])
函数需要将float向char[]转化,利用union联合体可以免去繁琐的转换过程。
联合体的定义格式为:
union 共用体名{
成员列表1;
成员列表2;
...;
成员列表n;
};
结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。
结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。
arduino端程序:
union SeFrame
{
float Float;
char Char[4];
};
SeFrame TEMP;
void setup() {
Serial.begin(9600);
}
void loop() {
delay(2000);
float t = 26.125;
TEMP.Float=t;
Serial.write(TEMP.Char,4);
}
上位机转换函数:
float RecFloat(char *a) //a为接收到的char数组
{
union
{
float Float;
char Char[4];
}recFloat;
memcpy(recFloat.Char,a,4);
return recFloat.Float;
}