عدم اجرای کد

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

@Mehrad#2987
سلام مهندس، ممنون که وقت برای دیباگ کردن کد گذاشتین. توضیحاتتون مثل همیشه کامل و جامع و دارای نکات مهمی برای من بود.
امیدوارم در تمام مراحل زندگی موفق باشید.

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

[upl-file uuid=71994beb-a953-4fd3-ae56-4b5798b08595 size=709B]sketch-oct28a.txt[/upl-file]

اما مهندس برگردیم روی همون کد اول من اون کد رو خیلی خلاصه کردم و فقط مشکلی که وجود داره این هستش تابع reader فراخوانی میشه ولی خروجی رشته وجود نداره یعنی تابع تمام کارکترهای ورودی رو باید تک تک به متغییر x که از نوع string هستش اضافه کنه و وقتی به کاراکتر n میرسه متغییر x رو برامون return کنه اما متغییر x مقداری نداره. مشکل اینجاست!!!
درضمن میدونم این قطعه کد نیاز به پاک کردن مقدار string بعداز رسیدن به n داره تا صحیح و کاملتر کار کنه اما فقط این قسمت که مشکل داره فعلا دیباگ بشه برام کافیه.
بازم ممنون مهندس

[upl-file uuid=45856bd3-4a6f-4694-9476-ec602b5c683c size=515B]error.txt[/upl-file]

سلام دوست عزیز، کد جدید رو دیدم. بهتون تبریک میگم. خیلی بهتر شده. چند نکته به نظرم میرسه:
۱. در همه حالت های if شما در نهایت متغیر str رو خالی کردید. خوب این می تونست بعد از if انجام بشه چون مستقل از نتیجه if هست.
۲. برای دریافت یک string روی سریال، می تونید از دستور readString استفاده کنید که در بسته توضیح داده شده و احتمالا در جلسات بعدی بررسی شده و شما هنوز بهش نرسیدید. با استفاده از اون دیگه لازم نیست که خودتون دنبال باشید و آخر رشته رو پیدا کنید.

نکته دیگه ای به ذهنم نمی رسه و در انتها بهتون تبریک میگم که تونستید این کد رو بنویسید و مشکلتون رو حل کنید. نکاتی مثل رعایت کردن indentation و define کردن پایه ها رو هم رعایت کنید. در ادامه کدها مرحله به مرحله پیچیده تر میشن و شما با استایل کد نویسی صحیح بیشتر آشنا میشید.

در مورد سوالتون در مورد کد قبلی هم، قبل از return کردن x اون رو پرینت بگیرید و ببینید مقدار داره یا نه. اگر مقدار داره و باز هم موقع return خالی برمیگرده، متغیر x رو به صورت global و خارج از loop و setup (بالاشون) تعریف کنید و ببینید مشکل حل میشه یا نه. خبرش رو به من بدید تا بعدش توضیح بدم که چه اتفاقی داره میافته. (البته مجدد تاکید می کنم که تا واقعا و صد در صد لازم نبود، متغیر ها رو به صورت global نباید تعریف کنید. ولی الان فقط جنبه آموزشی داره)

سلام مهندس
کدی نوشتم که ورودی رو کلمه به کلمه بخونه و هرگاه کلمات خاصی برابر با شرطی درون if اول شد پین 13 را high و هرگاه کلمات ورودی برابر با شرط if دوم شد پین 13 را low کنه ولی مشکل اینه خروجی تابع reader درست هستش ولی ifها کار نمیکنن. هر چه بالا پایینش کردم درست نشد.

[upl-file uuid=75074577-e99d-4e34-9730-3bedb84be247 size=825B]sketch-oct28a.txt[/upl-file]

سلام دوست عزیز، لطفا یکم در مورد کدتون برای من توضیح بدید. جون متغیر ها اسم هایی مثل a و b دارن و من در جریان کد شما نیستم و زیاد نمی تونم کمک کنم.
ولی چند تا نکته:

  • - شما چک کردید که تا وقتی که serial.available بود آنگاه تابع reader رو صدا زدید و اونجا هم مجدد همین مورد رو چک کردید. می تونید while اول رو به if تغییر بدید. چون داخل reader شما دارید هرآنچه که روی سریال اومده رو می خونید و عملا while اول فقط یکبار اتفاق میافته و میتونه به if تغییر کنه.
  • - شما در تابع reader ابتدا نوشتید return x و سپس زیرش هم چند خط کد زدید. توجه داشته باشید که بعد از دستور return، تابع شما مقدار رو برمی گردونه و دیگه ادامه کد اجرا نمیشه. پس کدهای b = 0; و x = x.substring(c,x.length()); دیگه اجرا نمیشن.
  • - متغیر str رو خارج از loop و setup تعریف کردید که کار درستی نیست.
  • - وقتی که دو تا شرط دارید که فقط یکیشون باید اجرا بشه، به جای if دوم از else if استفاده کنید.
  • - شما برای اینکه turnon و turnoff از لحاظ حروف بزرگ و کوچک اشتباه نشن، حالت های مختلف اونها رو چک کردید. به جای اینکار می تونید از اعداد استفاده کنید و یا اینکه در فرستنده و یا گیرنده چک کنید که همه حروف کوچک بشن. مثلا با استفاده از دستور toLowerCase() می تونید همه حروف یک string رو کوچک کنید. اینطوری مهم نیست فرستنده چطوری ارسال کرده، شما هر چیزی که فرستاده رو تبدیل به حروف کوچک می کنید و بعد فقط یک if استفاده می کنید که با حروف کوچک چک می کنه.
  • پس این نکات رو اصلاح کنید. بعد اگر مشکل حل شد که عالیه، اگر نشد، مجدد با توضیح خط به خط کد، همینجا سوال کنید. (قسمت های مهمش، مثلا serial.begin توضیح لازم نداره. اونجایی که مثلا b++ و یا c=b رو برام توضیح بدید که قصدتون چی بوده)

    @Mehrad#2936
    سلام مهندس، ممنون که وقت برای حل مشکل بنده میزارید.
    همنوطور که گفته بودین قبل از return مقدار متغییر x را پرینت بگیرم و متغیر رو بصورت global معرفی کنم رو قبل از اینکه کد رو برای شما ارسال کنم انجام داده بودم و دوباره هم انجام دادم ولی مقداری برای x چاپ نمیشه!!!
    پ.ن:من در حین تماشای آموزش خوب شما تا جاییکه میتونم از روش حل مسئله (قطعه کد) شما استفاده نمیکنم و سعی میکنم خودم راه حل رو پیدا کنم همین امر باعث شده سرعت حرکت آموزشیم کم بشه اینو عرض کردم چون فرموده بودید هنوز به دستورreadString نرسیدی.
    تشکر فراوان