پرش به محتوا

آموزش متغییر ها آردوینو – متغییر union (دارای اعضا)

در برنامه‌نویسی گاهی نیاز به سرهم کردن تعدادی متغییر کوچک دارید تا در نهایت یک متغییر بزرگ ایجاد کنید و در میان انواع روش ها، استفاده از متغییر نوع union جایگاهی ویژه‌‌ دارد. با استفاده‌‌ ‌از این متغییر میتوان انواع داده‌ها را با آدرس یکسان تولید کرد. مثلا در آردوینو می‌توانید یک متغییر 4 بایتی را با یک متغییر 32 بیتی در آدرس یکسان داشته باشید. در ادامه‌، با کاربرد این متغییر آشنا خواهید شد.
آموزش متغییر ها آردوینو

در این آموزش متغییر ها آردوینو به‌ کمک متغییر 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:

}
				
			

اشتراک گذاری این نوشته

دانشجوی رشته مکاترونیک صنعتی هستم و در زمینه اتوماسیون و توسعه صنعت فعالیت میکنم. سعی میکنم تجربیات و خورده دانشی که از الکترونیک دارم را با شما به اشتراک بگذارم.

شاید این مطالب براتون جذاب باشه!

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

تماس با ما

عضویت

عضو سایت هستید؟ برای ورود کلیک کنید

ورود به حساب کاربری