در این آموزش متغییر ها آردوینو به کمک متغییر union مجموعه ای از متغییر های مختلف را که از نظر سایز متفاوت هستند؛ اما با آدرس یکسان در حافظه میکرو قرار دارند، ایجاد میکنیم. در ادامه کاربرد و نحوه استفاده از این متغییر دارای اعضا با آدرس مشابه را برسی خواهیم کرد.
جهت شرکت در دوره، آموزش جامع توابع آردوینو – Fanctions کلیک کنید.
;{}union
شرح
متغییر union دارای اعضاء مختلف با سایز های متفاوت است که میتوانید انواع دیگر متغییر را به عنوان اعضای آن تعریف و استفاده کنید. نکته قابل توجه این نوع متغییر، یکسان بودن آدرس تمامی متغییر های اعضا در حافظه است. آدرس مشابه اعضاء به این معنی است که مثلا در متغییر 4 بایتی و متغییر 32 بیتی که هر دو از اعضا این مجموعه تعریف شده اند؛ آدرس یکسانی در دسترس است و هر مقداری در متغییر 4 بایتی قرار گیرد، دقیقا همان مقدار در متغییر 32 بیتی در دسترس است.
ساختار کد دستور
union{
valueType valueName;
}unionName;
مولفهها
valueType: نوع متغییر عضو مجموعه
valueName: اسم متغییر عضو مجموعه
نکته: محدودیتی برای تعداد و نوع اعضا مجموعه وجود ندارد.
unionName: اسم مجموعه نوع union
کاربرد و مثال متغییر union
کاربرد این قابلیت برای حالتی از کد نویسی است که قصد دارید 4 مقدار 8 بیتی را به هم متصل و یک مقدار 32 بیتی ایجاد کنید. در حالت عادی باید از کدی مشابه زیر برای این کار استفاده کنید.
uint8_t mybyte[4]; //این 4 بایت را میخواهیم متصل کنیم
uint32_t value; //در نهایت مقدار 4 بایت را در این متغییر قرار دهیم
uint32_t b2v[4]; // آرایه کمکی برای اتصال 4 بایت
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
// BIN -> 01101110 10101101 01101110 10101100
// val32 DEC -> 1856859820
// val32 HEX -> 6EAD6EAC
mybyte[3] = 0b01101110;
mybyte[2] = 0b10101101;
mybyte[1] = 0b01101110;
mybyte[0] = 0b10101100;
b2v[0] = (uint32_t)mybyte[0] & 0xFF;
b2v[1] = ((uint32_t)mybyte[1] << 8 ) & 0xFF00;
b2v[2] = ((uint32_t)mybyte[2] << 16) & 0xFF0000;
b2v[3] = ((uint32_t)mybyte[3] << 24) & 0xFF000000;
value = b2v[0] | b2v[1] | b2v[2] | b2v[3];
Serial.println(value, BIN);
Serial.println(value, DEC);
Serial.println(value, HEX);
}
void loop() {
// put your main code here, to run repeatedly:
}
کد بالا نمونه ساده به ظاهر پیچیده برای اتصال یک متغییر 4 بایتی به یکدیگر است تا در نهایت یک متغییر 32 بیتی داشته باشید. اما همین عملکرد با متغییر نوع union به سادگی کد زیر قابل انجام است.
union {
uint8_t val8[4]; //این 4 بایت را میخواهیم متصل کنیم
uint32_t val32; //در نهایت مقدار 4 بایت را در این متغییر قرار دهیم
} myvalue;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
// BIN -> 01101110 10101101 01101110 10101100
// val32 DEC -> 1856859820
// val32 HEX -> 6EAD6EAC
myvalue.val8[3] = 0b01101110;
myvalue.val8[2] = 0b10101101;
myvalue.val8[1] = 0b01101110;
myvalue.val8[0] = 0b10101100;
Serial.println(myvalue.val32, BIN);
Serial.println(myvalue.val32, DEC);
Serial.println(myvalue.val32, HEX);
}
void loop() {
// put your main code here, to run repeatedly:
}