آردوینومقدماتی۷ دقیقه مطالعهArduino IDE 2.x / Uno R3

عیب‌یابی سریال مانیتور

سرعت ارتباط، پایان خط و تفاوت setup و loop را می‌آموزید و رایج‌ترین مشکلات سریال مانیتور از خالی ماندن پنجره تا حروف نامفهوم و ورودی گرفتن عدد را رفع می‌کنید.

آنچه در این درس می‌آموزید

  • کانال سریال UART و نقش باود ریت را توضیح دهید
  • مشکلات خالی ماندن مانیتور، حروف نامفهوم و چاپ یک‌باره را عیب‌یابی کنید
  • عددی را با Serial.parseInt از مانیتور به برد بفرستید
نویسنده: تیم داکنامه · بازبینی: ۲۰۲۶-۱۰-۳۱
فهرست مطالب

سریال مانیتور پنجرهٔ گفت‌وگوی شما با برد است: برد پیام می‌فرستد و شما متن تایپ می‌کنید. اما گاهی پنجره خالی می‌ماند، حروف نامفهوم چاپ می‌شود یا ورودی شما بی‌جواب می‌ماند. تقریباً همهٔ این‌ها ریشه در چند قاعدهٔ ساده دارد که در این درس یکی‌یکی مرور می‌کنیم.

کانال سریال چطور کار می‌کند؟

سریال مانیتور روی کانال UART (ارتباط سریال غیرهم‌زمان) سوار است. روی Uno این کانال به پین‌های دیجیتال ۰ (RX) و ۱ (TX) وصل است و همان کانال از طریق تراشهٔ تبدیل USB به سریال به رایانه هم می‌رسد؛ یعنی چیزی که در مانیتور می‌بینید و چیزی که روی پین ۰ و ۱ می‌گذرد یکی است — برای همین هنگام آپلود هم هیچ چیز دیگری نباید به این دو پین وصل باشد.

برای اینکه دو طرف حرف هم را بفهمند، باید با یک سرعت توافق‌شده کار کنند؛ این سرعت باود ریت (Baud Rate) است و واحدش بیت در ثانیه است. در کد با Serial.begin(9600) و در منوی کشویی پایین پنجرهٔ مانیتور تنظیم می‌شود. دو قاعدهٔ دیگر مانیتور:

  • پایان خط (Line Ending) — منوی کنار باود ریت تعیین می‌کند که با زدن Send چه چیزی به انتهای متن شما اضافه شود: هیچ، Newline (کاراکتر \n)، Carriage return (کاراکتر \r) یا Both NL & CR. توابعی مثل Serial.parseInt به یک پایان خط برای فهمیدن پایان عدد نیاز دارند؛ پیش‌فرض Newline انتخاب خوبی است.
  • Show timestamp — چک‌باکس بالای پنجره به هر خط، زمان چاپ را اضافه می‌کند؛ برای سنجش فاصلهٔ زمانی رخدادها مفید است.

یک نکتهٔ مهم: باز کردن سریال مانیتور در IDE 2 برد را ریست می‌کند تا اسکچ از اول اجرا شود؛ پس اگر مانیتور را بعد از کار باز کنید، برنامه از ابتدای setup() شروع می‌شود و این عمداً چنین است.

جدول مشکلات رایج و رفع آن‌ها

نشانه علت محتمل راه‌حل
مانیتور کاملاً خالی است Serial.begin در setup نوشته نشده Serial.begin(9600); را در setup اضافه کنید
مانیتور خالی است اما begin هست باود ریت مانیتور با کد نمی‌خواند منوی پایین پنجره را روی سرعت کد بگذارید
حروف نامفهوم و علامت‌های بی‌معنا ناهم‌خوانی باود ریت هر دو سمت را یک سرعت کنید؛ 9600 رایج‌ترین است
فقط یک بار چاپ می‌کند و می‌ایستد پیام در setup است، نه در loop کد چاپ را به loop منتقل کنید یا حلقه را بررسی کنید
پیام‌ها وسط خط ادامه پیدا می‌کنند به‌جای println از print استفاده شده برای پایان خط از Serial.println استفاده کنید
تایپ می‌کنید اما برد واکنشی نشان نمی‌دهد متن را در کادر ورودی بالا ننوشته‌اید یا Send نزده‌اید متن را در کادر بالای پنجره بنویسید و دکمهٔ Send را بزنید
پیام port busy هنگام باز کردن مانیتور برنامهٔ دیگری پورت را گرفته یا آپلود در جریان است برنامه‌های دیگر را ببندید؛ اگر مانع آپلود شد، مانیتور را ببندید

نکتهٔ آخر مهم است: پورت سریال یک منبع انحصاری است و نمی‌تواند هم‌زمان به دو برنامه سرویس بدهد؛ به همین دلیل اگر آپلود با خطای دسترسی به پورت مواجه شد، اولین کار بستن سریال مانیتور است. تشخیص و رفع کامل این مورد را در درس خطاهای آپلود با پیام Access is denied دیده‌اید.

گرفتن عدد از کاربر: Serial.parseInt

برد فقط بایت می‌گیرد؛ برای خواندن یک عدد کامل که کاربر تایپ کرده، تابع Serial.parseInt ارقام پشت سر هم را جمع می‌کند تا به پایان عدد برسد. این اسکچ را آپلود کنید:

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

void loop() {
  if (Serial.available() > 0) {
    int value = Serial.parseInt();
    Serial.print("Received: ");
    Serial.println(value);
  }
}

توضیح خط‌به‌خط:

  1. Serial.available() تعداد بایت‌های رسیدهٔ خوانده‌نشده را می‌دهد؛ اگر صفر باشد، یعنی چیزی نفرستاده‌اند و منتظر نمی‌مانیم.
  2. Serial.parseInt() تا رسیدن پایان خط (کاراکتر \n که گزینهٔ Newline اضافه می‌کند) ارقام را می‌خواند و عدد کامل می‌سازد.
  3. Serial.print بدون پایان خط چاپ می‌کند و Serial.println بعد از عدد، خط را می‌بندد؛ ترکیبشان یک سطر تمیز می‌سازد.

حالا در کادر ورودی مانیتور عدد 42 را بنویسید و Send بزنید:

خروجی کد

Received: 42

اگر عدد نفرستید و کادر را خالی Send کنید، parseInt پس از مهلت پیش‌فرض یک ثانیه‌ای عدد صفر برمی‌گرداند؛ در کد واقعی می‌توانید این حالت را با چک کردن مقدار مدیریت کنید.

تمرین‌ها

تمرین

تمرین ۱ — تشخیص خرابی سریال از روی نشانه

سه سناریو زیر را جداگانه عیب‌یابی کنید و برای هرکدام علت محتمل و راه‌حل یک‌خطی بنویسید: (۱) مانیتور باز است، کد چاپ دارد، اما پنجره فقط علامت‌های نامفهوم مثل ??? و کاراکترهای عجیب نشان می‌دهد. (۲) مانیتور فقط یک بار پیام Setup done چاپ کرده و دیگر چیزی نمی‌آید. (۳) عدد 7 را می‌فرستید اما برد واکنشی نشان نمی‌دهد؛ کد همان اسکچ parseInt این درس است.

نمایش راه‌حل

(۱) نشانهٔ ناهم‌خوانی باود ریت است: برد و مانیتور با سرعت‌های متفاوت کار می‌کنند و هر بایت به کاراکتر اشتباهی تبدیل می‌شود؛ سرعت منوی پایین مانیتور را با مقدار Serial.begin یکی کنید (مثلاً 9600). (۲) چون پیام یک بار چاپ شده، کد داخل setup() است که فقط یک بار اجرا می‌شود؛ چاپ را به loop() منتقل کنید یا اگر پیام فقط برای گزارش شروع است، مشکلی نیست و رفتار طبیعی است. (۳) parseInt به پایان خط نیاز دارد؛ در منوی کنار باود ریت گزینهٔ Newline را انتخاب کنید و دوباره عدد را با دکمهٔ Send بفرستید — بدون کاراکتر پایان خط، تابع تا مهلت یک‌ثانیه‌ای منتظر می‌ماند و ممکن است عدد ناقص یا صفر برگرداند.

:::

خلاصه

  • سریال مانیتور روی کانال UART پین ۰ و ۱ و تراشهٔ USB به سریال سوار است.
  • باود ریت دو سمت باید یکی باشد؛ ناهم‌خوانی یعنی حروف نامفهوم.
  • Serial.begin در setup شرط هر چاپی است و println خط را می‌بندد.
  • پایان خط Newline برای توابعی مثل parseInt لازم است و باز کردن مانیتور برد را ریست می‌کند.
  • پورت سریال انحصاری است؛ پیام port busy با بستن برنامه‌های دیگر رفع می‌شود.

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

منابع و ارجاع‌ها