عیبیابی سریال مانیتور
سرعت ارتباط، پایان خط و تفاوت 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 ارقام پشت سر هم را جمع میکند تا به پایان عدد برسد. این اسکچ را آپلود کنید:
void setup() {
Serial.begin(9600);
}
void loop() {
if (Serial.available() > 0) {
int value = Serial.parseInt();
Serial.print("Received: ");
Serial.println(value);
}
}توضیح خطبهخط:
Serial.available()تعداد بایتهای رسیدهٔ خواندهنشده را میدهد؛ اگر صفر باشد، یعنی چیزی نفرستادهاند و منتظر نمیمانیم.Serial.parseInt()تا رسیدن پایان خط (کاراکتر \n که گزینهٔ Newline اضافه میکند) ارقام را میخواند و عدد کامل میسازد.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 با بستن برنامههای دیگر رفع میشود.
مانیتور حالا پنجرهٔ بیدردسر گفتوگوی شما با برد است؛ با این پنج درس، ابزارهای عیبیابی از کنسول تا مولتیمتر را کامل در اختیار دارید.