پرش به محتوا

آموزش توابع آردوینو – توابع گیرنده‌ سریال (Serial)

توابع گیرنده سریال در آردوینو برای خواندن و پردازش داده‌های دریافتی از پورت سریال به کار می‌روند. این توابع می‌توانند تعداد بایت‌های موجود برای خواندن را بررسی کرده و بایت بعدی داده ورودی را خوانده و برگردانند. همچنین، این توابع قادر هستند داده‌ها را از بافر سریال بخوانند تا یک رشته‌ی خاص یا یک کاراکتر پایان‌دهنده پیدا شود و اگر هدف پیدا نشود، مقدار خاصی را برمی‌گردانند. برخی از این توابع برای خواندن داده‌های عددی و تبدیل آن‌ها به اعداد صحیح و اعشاری استفاده می‌شوند و کاراکترهای غیرعددی را نادیده می‌گیرند تا به اولین کاراکتر عددی برسند. توابع دیگری نیز هستند که یک بایت از ورودی سریال را بدون حذف کردن آن از بافر می‌خوانند و برمی‌گردانند. به طور کلی، توابع گیرنده سریال ابزارهایی قدرتمند برای پردازش و تحلیل داده‌های دریافتی از ورودی سریال فراهم می‌کنند.
آموزش توابع آردوینو

در این آموزش توابع آردوینو، 12 تابع کلیدی گیرنده‌ برای دریافت داده‌ها از طریق پورت سریال آردوینو مورد بررسی قرار می‌گیرند. یکی‌ از این توابع میزان فضای‌ بافر سریال آماده‌‌ خواندن را مشخص می‌کند. تابع دیگری تمامی داده‌های دریافتی را از بافر سریال برمی‌گرداند. برای دریافت داده‌ها به‌ صورت متنی‌، تابعی‌ وجود دارد که می‌تواند داده‌ها را در فرمت های مختلف دریافت کند. همچنین، تابعی‌ برای‌ دریافت داده‌های باینری‌ یا خام موجود است. این توابع امکان تعامل مؤثر و کارآمد با دستگاه‌های جانبی‌ را فراهم می‌کنند.

جهت شرکت در دوره‌، آموزش جامع توابع آردوینو – Fanctions کلیک کنید.

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

available

شرح

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

ساختار کد دستور

				
					Serial.available()
				
			

مولفه‌ها

  • Serial: شی پورت سریال؛ لیست پورت های سریال موجود برای هر برد را در صفحه اصلی سریال ببینید.

مقدار بازگشتی

تعداد بایت های‌ موجود در بافر ورودی‌ پورت سریال را برای‌ خواندن برمیگرداند. 

find

شرح

داده‌ها را از بافر سریال می خواند تا زمانی‌ که‌ هدف پیدا شود. در صورت یافتن‌ هدف، تابع true و در صورت‌ اتمام‌ زمان، false را‌ برمی‌گرداند.

ساختار کد دستور

				
					Serial.find(target)
Serial.find(target, length)
				
			

مولفه‌ها

  • Serial: شی پورت سریال؛ لیست پورت های سریال موجود برای هر برد را در صفحه اصلی سریال ببینید.
  • target: یک رشته‌ی خاص در داده‌های ورودی سریال جستجو می‌کند. (داده‌ مجاز: char)
  • length: طول رشته‌ مورد جستجو. (داده‌ مجاز: size_t)

مقدار بازگشتی

در صورت یافتن رشته‌ مورد نظر مقدار true را برمی‌گرداند.(نوع داده‌: bool)

هشدار‌ها و اخطار‌ها

تابع find پس از جسنجو بافر ورودی پورت سریال را پاک می‌کند.

findUntil

شرح

تابع `findUntil` در آردوینو داده‌ها را از بافر سریال می‌خواند تا زمانی‌ که‌ یکی‌ از دو شرط برقرار شود: یا یک رشته‌ هدف با طول مشخص پیدا شود، یا یک رشته‌ پایان‌دهنده‌ مشخص شده‌ یافت شود. اگر رشته‌‌ هدف پیدا شود، تابع مقدار `true` را برمی‌گرداند؛ در غیر این صورت، اگر مدت زمان مشخصی‌ بگذرد و رشته‌ هدف پیدا نشود، تابع مقدار `false` را برمی‌گرداند.

ساختار کد دستور

				
					Serial.findUntil(target, terminal)
				
			

مولفه‌ها

  • Serial: شی پورت سریال؛ لیست پورت های سریال موجود برای هر برد را در صفحه اصلی سریال ببینید.
  • target: یک رشته‌ی خاص در داده‌های ورودی سریال جستجو می‌کند. (داده‌ مجاز: char)
  • terminal: کاراکتر ترمینال برای جستجو (داده‌ مجاز: char)

نمونه برنامه

				
					void setup() {
  Serial.begin(9600);
}

void loop() {
  if (Serial.available()) {
    if (Serial.find("hello")) {
      Serial.println("Found 'hello'");
    } else {
      Serial.println("Not found");
    }

    if (Serial.findUntil("world", '\n')) {
      Serial.println("Found 'world'");
    } else {
      Serial.println("Not found or end reached");
    }
  }
}

				
			

این کد در آردوینو داده‌های ورودی‌ سریال را بررسی می‌کند؛ اگر رشته‌ “hello” پیدا شود، پیام “Found ‘hello'” چاپ می‌کند و در غیر این صورت، پیام “Not found” را نمایش می‌دهد. همچنین، با استفاده‌‌ از تابع `Serial.findUntil` بررسی‌‌ می‌کند که‌‌ آیا رشته‌‌ “world” قبل از رسیدن به‌‌ کاراکتر پایان‌دهنده‌‌ ‘\n’ یافت می‌شود؛ در صورت یافتن، پیام “Found ‘world'” را چاپ کرده‌ و در غیر این صورت پیام “Not found or end reached” را نشان می‌دهد.

parseFloat

شرح

این تابع گیرنده‌ سریال در آردوینو برای‌ خواندن داده‌ها از ورودی‌ سریال و تبدیل آن‌ها به‌ یک مقدار اعشاری (float) استفاده‌ می‌شود. این تابع از اولین کاراکتر عددی‌ تا زمانی‌ که‌ با یک جداکننده‌ (مانند فاصله یا خط جدید) برخورد کند، داده‌ها را می‌خواند و به صورت یک عدد اعشاری برمی‌گرداند. اگر در مدت زمان تعیین‌شده هیچ عددی پیدا نشود، مقدار صفر را برمی‌گرداند.

ساختار کد دستور

				
					Serial.parseFloat()
Serial.parseFloat(lookahead)
Serial.parseFloat(lookahead, ignore)
				
			

مولفه‌ها

  • lookahead: برای تعیین نحوه اسکن داده‌های ورودی سریال استفاده می‌شود. این پارامتر مشخص می‌کند که تابع هنگام جستجوی یک عدد اعشاری، چگونه باید با کاراکترهای غیرعددی برخورد کند. از 3 حالت زیر می‌توانید استفاده کنید.
    SKIP_ALL:
    این حالت پیش‌فرض است. هنگام اسکن جریان برای یک عدد ممیز شناور، همه کاراکترها به جز علامت منفی، نقطه اعشار یا ارقام نادیده گرفته می‌شوند.
    SKIP_NONE: هیچ چیزی نادیده گرفته نمی‌شود و جریان لمس نمی‌شود مگر اینکه اولین کاراکتر، انتظار معتبر باشد.
    SKIP_WHITESPACE: فقط کاراکترهای فاصله، تب، فید خط، و برگرداندن کالسکه نادیده گرفته می‌شوند.
  • ignore: برای نادیده گرفتن کاراکترهای خاص هنگام اسکن ورودی سریال استفاده می‌شود. این مولفه می‌تواند یک رشته از کاراکترها باشد که باید هنگام پردازش داده‌ها نادیده گرفته شوند، مانند `,` یا `;`، و به تابع کمک می‌کند تا عدد اعشاری را با دقت بیشتری از ورودی سریال بخواند و تفسیر کند.

مقدار بازگشتی

عدد اعشاری از نوع داده‌ float بر می‌گرداند.

parseInt

شرح

تابع `parseInt` در آردوینو برای خواندن داده‌های عددی از ورودی سریال و تبدیل آن‌ها به عدد صحیح استفاده می‌شود. این تابع ابتدا کاراکترهای غیر عددی را نادیده می‌گیرد تا به اولین عدد برسد و سپس ارقام متوالی را تا رسیدن به یک جداکننده می‌خواند. اگر عدد با علامت منفی شروع شود، عدد منفی برگردانده می‌شود. در صورتی که مدت زمان معین بگذرد و هیچ عددی پیدا نشود، مقدار صفر برمی‌گردد. این تابع به ویژه برای پردازش ورودی‌های عددی سریال و تعامل با دستگاه‌های دیگر مفید است.

ساختار کد دستور

				
					Serial.parseInt()
Serial.parseInt(lookahead)
Serial.parseInt(lookahead, ignore)
				
			

مولفه‌ها

  • Serial: شی پورت سریال؛ لیست پورت های سریال موجود برای هر برد را در صفحه اصلی سریال ببینید.
  • lookahead: برای تعیین نحوه اسکن داده‌های ورودی سریال استفاده می‌شود. این پارامتر مشخص می‌کند که تابع هنگام جستجوی یک عدد صحیح، چگونه باید با کاراکترهای غیرعددی برخورد کند. از 3 حالت زیر می‌توانید استفاده کنید.
    SKIP_ALL:
    این حالت پیش‌فرض است. هنگام اسکن جریان برای یک عدد صحیح، همه کاراکترها به جز علامت منفی، ارقام نادیده گرفته می‌شوند.
    SKIP_NONE: هیچ چیزی نادیده گرفته نمی‌شود و جریان لمس نمی‌شود مگر اینکه اولین کاراکتر، انتظار معتبر باشد.
    SKIP_WHITESPACE: فقط کاراکترهای فاصله، تب، فید خط، و برگرداندن کالسکه نادیده گرفته می‌شوند.
  • ignore: برای نادیده گرفتن کاراکترهای خاص هنگام اسکن ورودی سریال استفاده می‌شود. این مولفه می‌تواند یک رشته از کاراکترها باشد که باید هنگام پردازش داده‌ها نادیده گرفته شوند، مانند `,` یا `;`، و به تابع کمک می‌کند تا عدد صحیح را با دقت بیشتری از ورودی سریال بخواند و تفسیر کند.

مقدار بازگشتی

عدد صحیح از نوع داده‌ int بر می‌گرداند.

peek

شرح

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

ساختار کد دستور

				
					Serial.peek()

				
			

مولفه‌ها

  • Serial: شی پورت سریال؛ لیست پورت های سریال موجود برای هر برد را در صفحه اصلی سریال ببینید.

مقدار بازگشتی

اولین بایت داده ورودی سریال موجود (یا -1 اگر هیچ داده‌ای موجود نباشد) – عدد صحیح (int)

read

شرح

این تابع گیرنده‌ سریال آردوینو برای‌ خواندن داده‌های ورودی‌ سریال استفاده می‌شود. این تابع بایت بعدی داده ورودی از پورت سریال را می‌خواند و آن را برمی‌گرداند. اگر هیچ داده‌ای در دسترس نباشد، مقدار -1 را برمی‌گرداند.

ساختار کد دستور

				
					Serial.read()


				
			

مولفه‌ها

  • Serial: شی پورت سریال؛ لیست پورت های سریال موجود برای هر برد را در صفحه اصلی سریال ببینید.

مقدار بازگشتی

اولین بایت داده ورودی سریال موجود (یا -1 اگر هیچ داده‌ای موجود نباشد) – عدد صحیح (int)

نمونه برنامه

				
					int incomingByte = 0; // for incoming serial data

void setup() {
  Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
}

void loop() {
  // send data only when you receive data:
  if (Serial.available() > 0) {
    // read the incoming byte:
    incomingByte = Serial.read();

    // say what you got:
    Serial.print("I received: ");
    Serial.println(incomingByte, DEC);
  }
}
				
			

این کد در آردوینو داده‌های ورودی سریال را بررسی می‌کند؛ اگر داده‌ای موجود باشد، بایت ورودی سریال خوانده شده و مقدار آن در متغیر `incomingByte` ذخیره می‌شود. سپس، عبارت `”I received: “` به همراه مقدار بایت خوانده شده به صورت عدد دسیمال (مبنای 10) چاپ می‌شود. این فرآیند به طور مداوم تکرار می‌شود تا زمانی که داده‌های جدیدی از پورت سریال دریافت شوند.

readBytes

شرح

کاراکترها را از پورت سریال در بافر می خواند. اگر طول تعیین شده خوانده شده باشد یا زمان آن تمام شود، این تابع خاتمه می یابد. 0 به این معنی است که هیچ داده معتبری پیدا نشد.

ساختار کد دستور

				
					Serial.readBytes(buffer, length)
				
			

مولفه‌ها

  • Serial: شی پورت سریال؛ لیست پورت های سریال موجود برای هر برد را در صفحه اصلی سریال ببینید.
  • buffer: اشاره‌گر بافر برای ذخیره بایت‌ها و کارکترها ورودی پورت سریال
  • length: تعداد فضای آرایه بافر جهت دریافت بایت‌ها و کارکتر‌ها

مقدار بازگشتی

تعداد بایت های نوشته شده‌ در بافر از ورودی سریال را برمی‌گرداند، هرچند خواندن آن عدد اختیاری است. (نوع داده: size_t)

نمونه برنامه

				
					void setup() {
  Serial.begin(9600); // باز کردن ارتباط سریال با نرخ بیت 9600
  Serial.println("Serial readBytes example:");
}

void loop() {
  if (Serial.available()) { // اگر ورودی سریال در دسترس بود
    char buffer[5]; // تعریف یک بافر با اندازه ۵ بایت
    int bytesRead = Serial.readBytes(buffer, 5); // خواندن ۵ بایت داده به بافر
    Serial.print("Read bytes: ");
    for (int i = 0; i < bytesRead; i++) {
      Serial.print(buffer[i]); // چاپ هر بایت خوانده شده
    }
    Serial.println(); // چاپ یک خط جدید بعد از پایان بایت‌ها
  }
}

				
			

readBytesUntil

شرح

کاراکترها را از بافر سریال میخواند و در یک آرایه کاراکتر ذخیره می‌کند. این تابع زمانی مفید است که بخواهید داده‌ها را تا یک علامت خاص (مانند پایان یک خط یا یک کاراکتر جداکننده) بخوانید.

ساختار کد دستور

				
					Serial.readBytesUntil(character, buffer, length)
				
			

مولفه‌ها

  • Serial: شی پورت سریال؛ لیست پورت های سریال موجود برای هر برد را در صفحه اصلی سریال ببینید.
  • buffer: اشاره‌گر بافر برای ذخیره بایت‌ها و کارکترها ورودی پورت سریال
  • length: تعداد فضای آرایه بافر جهت دریافت بایت‌ها و کارکتر‌ها
  • character: جستجو کاراکتر برای‌ پایان دادن به‌ خواندن ورودی‌ سریال (نوع داده: char)

مقدار بازگشتی

تعداد بایت های نوشته شده را برمی گرداند، هرچند خواندن آن عدد اختیاری است. (نوع داده: size_t)

نمونه برنامه

				
					void setup() {
  Serial.begin(9600); // باز کردن ارتباط سریال با نرخ بیت 9600
  Serial.println("Serial readBytesUntil example:");
}

void loop() {
  if (Serial.available()) { // اگر ورودی سریال در دسترس بود
    char buffer[20]; // تعریف یک بافر با اندازه ۲۰ بایت
    int bytesRead = Serial.readBytesUntil('\n', buffer, 20); // خواندن داده‌ها تا کاراکتر '\n' یا تا ۲۰ بایت
    Serial.print("Read bytes: ");
    for (int i = 0; i < bytesRead; i++) {
      Serial.print(buffer[i]); // چاپ هر بایت خوانده شده
    }
    Serial.println(); // چاپ یک خط جدید بعد از پایان بایت‌ها
  }
}

				
			

readString

شرح

کاراکترهای بافر ورودی سریال را به صورت رشته String می‌خواند.در صورت تمام شدن زمان، عملکرد خاتمه می یابد.

ساختار کد دستور

				
					Serial.readString()
				
			

مولفه‌ها

  • Serial: شی پورت سریال؛ لیست پورت های سریال موجود برای هر برد را در صفحه اصلی سریال ببینید.

مقدار بازگشتی

یک رشته از نوع داده String از بافر ورودی سریال برمی‌گرداند.

readStringUntil

شرح

کاراکترهای بافر ورودی سریال را به صورت رشته String می‌خواند.در صورت تمام شدن زمان، عملکرد خاتمه می یابد.

ساختار کد دستور

				
					Serial.readStringUntil(terminator)
				
			

مولفه‌ها

  • Serial: شی پورت سریال؛ لیست پورت های سریال موجود برای هر برد را در صفحه اصلی سریال ببینید.
  • terminator: جستجو کاراکتر برای‌ پایان دادن به‌ خواندن ورودی‌ سریال (نوع داده: char)

مقدار بازگشتی

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

serialEvent

شرح

تابع آردوینو وقفه گیرنده‌ سریال هنگامی‌ که داده‌‌ در دسترس باشد در انتهای‌ ()loop فراخوانی‌ می شود. از ()Serial.read برای گرفتن این داده‌ها استفاده‌ کنید.لطفا توجه داشته‌ باشید: اکثر بردهای مدرن از این روش پشتیبانی نمی کنند. (مناسب برد های مبتنی بر AVR)

ساختار کد دستور

				
					void serialEvent() {
      //statements
    }
				
			

مولفه‌ها

تابع ()serialEvent روی Leonardo، Micro یا Yún کار نمی کند.
همچنین تابع ()serialEvent و ()serialEvent1 روی بردهای SAMD آردوینو کار نمی کنند.
تابع ()serialEvent و ()serialEvent1 و ()serialEvent2 و ()serialEvent3 در Arduino Due کار نمی کنند.

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

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

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

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

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

تماس با ما

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

عضویت

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