نمایش/عدم نمایش سایدبار
رفتن به بالای صفحه
مهدی دمیرچیلو

آموزش جامع آردوینو جلسه 5

به نام خدا

آموزش جامع آردوینو جلسه 5 : سلام دوباره خدمت شما بزرگواران، تو این مطلب از آموزش آردینو که جلسه 5شه میخوام برم سراغ توضیح توابع Serial.read و Serial.readBytes و Serial.readBytesUntil که توابع پروتکول ارتباط سریال در آردینو هستن؛ تو این مطلب تا دلتون بخواد مثال و پروژه آردینو گزاشتم تا دو هزاریتون قشنگ بیوفته.  heart
آموزش جامع آردوینو جلسه 5

آموزش آردینو

خوب بریم سراغ ادامه توضیح توابع ارتباط سریال در آردوینو…این مطلب هم طبق معمول طولانی شد لذا سعی کنید با حوصله بخونید چون من با حوصله نوشتم(چه ربطی داشت crazy )
 

Serial.read
Serial.read : این تابع کارش دریافت اطلاعات هستش ، اطلاعاتی که توسط فرستنده ارسال میشه ، در گرنده توسط این تابع اطلاعات دریافت میشه.

در زیر یه مثال از کاربرد این تابع میتونید ببینید:

اجرای پروژه : شما میتونید این کد ها رو در نرم افزار آردوینو بریزید و رو بردتون کامپایلش کنید و در نرم افزار آردوینو از منوی tools گزینه serial monitor رو انتخاب گنید تا پنجره ارتباط سریال باز بشه و شروع کنید به تست کردن پروژه ......اینو بعدا توضیح میدم کامل(هر چند که همش رو همین الان گفتم و چیزی غیر از این نداره) ، الان سریع گفتم  شاید کسی بخواد پروژه رو تست کنه و عملکردش رو ببینیه و مثل ما کم طاقت هستش smile
 
توجه(مهم) : خروجی تابع Serial.read اطلاعات دریافت شده هستش ولی وقتی دیتایی موجود نباشه تابع Serial.read مقدار "1-" رو بر میگردونه.(برای اطمینان میتونید برنامه زیر رو تست کنید)

خط 12 : وقتی دیتایی دریافت بشه توسط تابع Serial.read ؛ این مقدار یه چیزی بین 0 تا 255 هستش ، این دیتایی که ما دریافت میکنیم در واقع همون کد اسکی اون کاراکتر دریافت شده هستش(به هر کاراکتری یه عدد انتساب دادن به نام کد اسکی، اگه خواستید میتونید مطلب مقابل رو بخونید: اسکی (ASCII) چیست؟ )، خوب به این دلیل که کد اسکی ها از صفر شروع میشن تا تقریبا 255 ، لذا مقدار my_data همیشه بزرگتر از صفر هستش >>> وقتی دیتایی ارسال بشه این if توی خط 12 کد های داخلش اجرا میشن.
خط 17 : وقتی دیتایی ارسال نشه ، تابع Serial.read مقدار "1-" رو برمیگردونه(یه مقداری به ما میده ، توجه داشته باشید حتی وقتی دیتایی ارسال نشه تابع Serial.read یه مقداری رو برمیگردونه) ؛ لذا زمان هایی که دیتایی برا دریافت کردن وجود نداره تابع Serial.read  مقدار منفی 1 رو بر میگردونه. و اگه پروژه رو اجرا کنید و این خط رو از حالت توضیحات در بیارید میبینید که هی و هی و هی "!!!Hang" رو نشون میده یعنی برنامه هنگ کرده و رفته تو حلقه بی نهایت ارسال و دریافت دیتا.
 

 
Serial.readBytes
Serial.readBytes : این تابع به صورت زیر هستش ، که مثل تابع Serial.read هستش کارش ، با این تفاوت که اطلاعات رو در آرایه buffer ذخیره میکنه و تعداد بایت دریافتی رو هم میشه تعیین کرد.

buffer : یه آرایه از نوع char یا byte که اطلاعات دریافتی درونش ذخیره میشه
length : یه متغیر از نوع int  که کارش تعیین تعداد بایت مورد نظر که باس دریافت بشه و در آرایه ذخیره بشه.
 
توجه(مهم) : تو کد زیر اطلاعات دریافت شده در my_data و تعداد بایت دریافت شده در data ذخیره میشن.

 
مثال زیر رو ببینید تا عملکرد این تابع رو قشنگ قشنگ متوجه بشید heart

خط 1 : تعریف یه آرایه که 3 خونه داره ، اطلاعات قراره تو این آرایه ذخیره بشن ( اگه نمیدونید آرایه چیه تو گوگل بسرچید "انواع متغیر و آرایه در c" ؛ فعالا حال توضیح دادنش رو ندارم ، جاش هم نیست بخوام این جا توضیحش بدم )
خط 6 : صد دفه تا حالا گفتم کار اینو  blum
خط 11 : اگه یادتون باشه(که بعید میدونم) تابع Serial.available کار این بود که اگه اطلاعاتی قابل دریافت باشه به ما اعلام میکرد و میتونست تا 64 بایت دیتا رو داخل خودش نگه داره و نزاره که از بین برن؛ حالا تو شرط if اومدیم گفتیم اگه اطلاعاتی قابل دریافت هستش (حداقل اطلاعات قابل دریافت 1 بایت باس باشه یا بزرگتر از 0 باشه ^_^) اون وقت بیا و کد های داخل if رو اجرا کن.
خط 13 : توسط این تابع 3 بایت دیتا دریافت میکنیم ، و اون متغیر number هم تعداد بایت دریافت شده توسط تابع Serial.readBytes هستش.(در "توجه" بالا گفتم که خروجی (چیزی که برمیگردونه) تابع Serial.readBytes تعداد بایت هایی که دریافت کرده هستش)
خط 17 و 18 : تو این دو خط اومدیم دیتا هایی رو که دریافت کردیم رو نشون میدیم ، البته میتونستیم به صورت زیر هم بنویسیم

فقط تنها مشکلی که پیش میومد این بود که تو دفعه اول دریافت و نمایش دیتا پروژه خوب کار میکنه(مثلا فک کنید دفه ی اول 3 بایت در my_data  ذخیره میشه) ولی از دفه دوم به بعد(اگه تعداد بایت ذخیره شده در my_data مثلا بشه 2 تا) میاد و 2 بایت دریافت کرده(2 بایت جدید) رو نشون میده اما بایت 3 ام (که از دفعه ی اول مونه) رو هم نشون میده.
خط 20 : رفتنن به خط بعد. shock >>>> laugh
 
توجه(مهم) : تو پروژه بالا از تابع Serial.available استفاده کردیم ، میتونیم پروژه ای بنویسیم که از تابع Serial.available استفاده نکنیم و آردوینو هم هنگ نکنه(نره تو حلقه بی نهایت ارسال دیتا)، اگه یادتون  باشه گفتم که تابع Serial.readBytes تعداد بایت دریافت کرده رو نشون میده(بر میگردونه) و اگه چیزی دریافت نکنه "0" برمیگردونه ، حالا از همین خاصیت استفاده میکنیم به طوری که دیگه نیازی به استفاده از تابع Serial.available نباشه و برنامه هم هنگ(حلقه بینهایت ارسال دیتا) نکنه.

تو این پروژه اومدیم و گفتیم اگه تعداد بایت دریافت شده(number) بزرگتر از صفر بود یعنی دیتا دریافت کردیم لذا نشون بده این دیتا ها رو و وقتی مقدار number برابر صفر بشه هم یعنی تابع دیتایی دریافت نکرده لذا برای این که حالت ببینهایت( هنگ کردن آردوینو ) رخ نده خط 22 پروژه بالا رو به صورت توضیحات درابردم.(میتونید این خط رو از حالت توضیحات دربیارید و ببینید که چطور آردوینو هنگ میکنه یا همون میره تو حالت ارسال بینهایت دیتا rofl ....دیالوگ تکراری ، چند بار تا حالا این یه ذره جمله رو من تکرار کردم bad )

 
Serial.readBytesUntil
Serial.readBytesUntil : این تابع به صورت زیر هستش که اندازه length (یه عدد صحیح) دیتا رو از پورت سریال میخونه و اطلاعات رو در buffer(یه آرایه) ذخیره میکنه و وقتی به کاراکتر تعیین شده(character) رسید عملیات خواندن اطلاعات رو متوقف میکنه.

 
توجه :  تابع Serial.readBytesUntil تعداد بایتی رو که دریافت کرده(تا قبل از این که به کاراکتر تعیین شده برسه) رو برمیگردونه ، اگه دیتایی موجود نباشه عدد 0 رو برمیگردونه؛ مثال زیر رو ببینید تا کاملا متوجه بشید :

خط 18 : رفتن به خط بعد ^_^
خط 13 : اون متغییر number تعداد بایت های ذخیره شده در my_data رو برمیگردونه
خط 11 : چون از تابع Serial.available درپروژمون استفاده کردیم ، لذا لازم نیست بررسی کنیم که مقدار number بزرگتر از 0 هستش یا نه(چون حتما بزرگتر از 0 است ، دلیلش هم اینه که تابع Serial.available وقتی اجرا میشه که حداقل یه بایت برا خوندن موجود باشه لذا مقدار number همیشه بزرگتر از 0 هستش.)
خط 15 و 16 : توضیحات این قسمت دقیقا مثل توضیحات خط 17 و 18 پروژه توی قسمت Serial.readBytes هستش.(بالا رو ببینید)
 
توجه(مهم) : تو پروژه زیر از تابع Serial.available استفاده نکردیم و کاری کردیم که برنامه هنگ نکنه.

تو این پروژه اومدیم و گفتیم اگه تعداد بایت دریافت شده(number) بزرگتر از صفر بود یعنی دیتا دریافت کردیم لذا نشون بده این دیتا ها رو و وقتی مقدار number برابر صفر بشه هم یعنی تابع دیتایی دریافت نکرده لذا برای این که حالت ببینهایت( هنگ کردن آردوینو ) رخ نده خط 20 پروژه بالا رو به صورت توضیحات درابردم.(میتونید این خط رو از حالت توضیحات دربیارید و ببینید که چطور آردوینو هنگ میکنه یا همون میره تو حالت ارسال بینهایت دیتا rofl ....دیالوگ تکراری ، چند بار تا حالا این یه ذره جمله رو من تکرار کردم bad )

 


جمع بندی : تو این مطلب 3 تا تابع گفتم و برا هرکدومشون مثالی زدم و بازم برا هر کدومشون گفتم چیکار کنیم تا از Serial.available استفاده نکنیم و برنامه هم هنگ نکنه.


 
اوه مای گاد…بابام در اومد….هی مینوشتم بعد میدیدم جابجا نوشتم بعد میدیدم یه چیز برا یه تابع نوشتم و برا 2 تای دیگه ننوشتم بعد میدیدم کدها رو میشه بهتر کنم و ساده تر کنم…بعد دیدم که 2 روز طول کشید این مطلب cry
توجه : دوستان اگه جایی رو اشتباه گفتم لطفا ذکر کنید
جوک : همین الان(دیروز bomb ) دیدم که جزئیات و نکات یه تابع دیگه رو داشتم برا یه تابع دیگه میگفتم و وقتی هم مییرفتم سایت آردوینو میدیدم که اشتباه نوشته ، بعد پیش خودم میگفتم چرا اینا اشتباه نوشتن laugh ، بعد دیدم نه مشکل از خودمه mosking
خوب این قسمت هم تموم شد ، تو مطلب بعدی بازم باس بریم سراغ بقیه توابع cry  ، امیدوارم تا 2 جلسه بعد دیگه تموم بشه و از دستش راحت شیم bomb
امید وارم از این مطلب ناچیز خوشتوم اومده باشه yes ….اگه این مطالب براتون مفید بود :
نظر، انتقاد و پیشنهاداتون رو بگید و تعجیل در فرج آقا و شادی روح شهدا و امام شهدا و سلامتی رهبر و علمای اسلام سه تا صلوات بفرستید  heart 
تا مطلب بعدی یا علی. bye 

پسورد فایل های سایت :
www.dmf313.ir
مهدی دمیرچیلو جنگ ما فتح قدس را در پی خواهد داشت (امام خمینی) >>>>>> اگر از صدام بگذریم، اگر مسأله قدس را فراموش کنیم، اگر از جنایت های امریکا بگذریم از آل سعود نخواهیم گذشت. ان‌شاالله اندوه دلمان را را در وقت مناسب با انتقام از امریکا و ال سعود برطرف خواهیم کرد و داغ و حسرت حلاوت این جنایت بزرگ را بر دلشان خواهیم گذاشت و با برپایی جشن پیروزی حق بر جنود کفر و نفاق و آزادی کعبه از دست نااهلان و نامحرمان به مسجد الحرام وارد خواهیم شد (امام خمینی)
ارسال دیدگاه
22

1) تعداد حروف غیر فارسی از حروف فارسی بیشتر باشه دیدگاه به صورت خودکار حذف میشه.

2) به موارد درخواست پروژه/کد آماده و سوالاتی که بلد نباشم پاسخ داده نمیشه.

3) برای گزاشتن کدهاتون از این سایت استفاده کنید : debian

  1. Avatar

    مهمان

    بیژن فرهنگ

    سلام مهندس
    شما از چهIDE استفاده می کنید که زمینه اش سیاه خطوطش شماره دار و کلماتش رنکی است
    خیلی محیط جالبی است
    ممنون میشوم راهنمایی فرمایید

    1396/04/09
    04:58
    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام – این مربوطه به سایت و نه IDE

      1396/04/09
      10:38
  2. Avatar

    مهمان

    علی

    سلام ممنون بابت آموزش خوبتون
    من یه مشکل تو ارتباط سریال آردینو با atmega8 کردم.
    آردینو مگا با آردینو uno به راحتی ارتباط برقرار میکنه ولی با atmega8 نه
    کریستال و باودریت ها یکسانه
    لطفا راهنمایی کنید

    1395/12/11
    12:38
    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام – ببین کجا سوتی دادی – اتصالات – برابر نبودن تنظیمات در دو طرف و…

      1395/12/11
      01:07
  3. Avatar

    مهمان

    محمد

    سلام.
    من این مثالی که زه بودین رو عملی بستم.
    #include
    LiquidCrystal lcd(8,9,10,11,12,13);
    char my_data;
    void setup()
    {
    Serial.begin(9600);
    lcd.begin(16,2);
    }
    void loop()
    {
    lcd.setCursor(0,0); lcd.print(“my_data=”);
    if (Serial.available() > 0)
    {
    my_data =Serial.read();
    Serial.print(“DATA IS = “);
    Serial.println(my_data);
    lcd.setCursor(0,1); lcd.print(my_data);
    }
    }
    بعد میخام دیتا دریافتی رو روی lcd هم نمایش بدم ولی وقتی دیتا میفرستم lcd قاطی میکنه 0علامت ؟ نشون میده.

    1395/07/25
    10:12
    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام
      کد زیر رو بزار داخل Setup
      lcd.setCursor(0,0); lcd.print(“my_data=”);
      lcd.write رو هم تست کن.
      مقدار اولیه متغییرت رو ‘0’ قرار بده.
      تو خط زیر، نمیدونم دیتا با چه فرمتی به سمت میکرو ارسال میکنی ولی اگه تمام کار ها رو کردی و جواب نداد بیا یه ‘0’ به مقدار خونده شده از پنجره سریال اضافه کن و بعد بده به متغیرت
      my_data =Serial.read();

      1395/07/25
      12:18
  4. Avatar

    مهمان

    اقا
    1395/06/15
    07:32
  5. Avatar

    مهمان

    احسان

    با سلام
    آقا مهدی واسه سایت خوبتون ازت تشکر میکنم.ی مشکل برام پیش اومده دوس داشتم مطرح کنم اگه کسی اطلاع داره کمکم کنه.به وسیله ماژول بلوتوث hc05 به آردوینو ارتباطش برقرار کردم حالا میخوام بوسیله گوشی براش ی کد بفرستم و مثلا ی LED روشن کنه که در اینجا مشکلی پیش نمیاد و درست عمل میکنه.
    جایی که مشکل دارم اینجاست که میگم حالا ی کد دیگه براش بفرستم که اگه فلان LED روشن باشه ی کد از آردوینو به سمت گوشی بفرسته که متاسفانه فرستاده نمیشه میخواستم بدونم مشکل کجاست؟؟
    البته متوجه شدم که اگر دو تا if در هم باشه این مشکل پیش میاد اگه یکی باشه مشکل نداره
    ممنون میشم کمک کنید
    برنامه نویسیش :

    1395/06/02
    03:04
    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام
      احتمالا اگه مدار در عمل درست باشه مشکل از ریجستر ها میتونه باشه – که فقط مثلا گیرنده بودن رو فعال کردی و فرستنده رو نه – ریجستر های ارتباط سریال

      1395/06/02
      06:52
  6. Avatar

    مهمان

    موسوی

    با سلام. مهندس ممنون از آموزشهای خوبتون. یه سوال داشتم. من کد ارتباط سریال رو نوشتم و برد من آردینو مگا2560 هست. دیتا رو به کامپیوتر با مبدل USB به Serial می فرستم. دیتای ارسالی از برد به درستی در ترمینال ویندوز (نرم افزار RealTerm) دیده می شه اما نمیتونم از کامپیوتر دیتا به برد بفرستم. مشکل از چیه؟

    1395/01/20
    10:03
    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام
      تا جایی که یادمه نیاز به برد تبدیل نیست چون خود آردوینو رو که با usb وصل میکنی کافیه
      تو ترمینال خود آردوینو تست کنید و بعد برید سراغ ترمینال های دیگه

      1395/01/20
      10:29
  7. Avatar

    مهمان

    حسین

    سلام خداقوت
    عالی بود

    1394/11/21
    09:12
  8. Avatar

    مهمان

    مملی

    عالی بود، جای قلی خالی بود.

    1394/11/09
    12:45
  9. Avatar

    مهمان

    mostafa

    سلام داش مهدی!
    دمت گرم ! خداقوت!
    امشب جلسه پنجم رو خوندم!
    حاجی یدونه ای! (دوتا بودی هیئت میزدیم خدایی)
    ولی خدایی من این همه سریال نمیره تو کلم! D-:

    1394/07/18
    12:16
    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام
      والا وا سیبیل رو هم بازور داریم چه برسه به ریش
      تیپمون هم که دیگه laugh
      ولی به زودی کبلایی میشم انشاالله blum
      والا اینجا دانشگاه و مدرسه نیست که بخوای همه چیز رو حفظ کنی…..هر موقع لازمت شد یه سر به مطلب بزن و ببین کدوم تابع بدردت میخوره و ازش استفاده کن…..کاری که من میکنم

      1394/07/18
      01:27
  10. Avatar

    مهمان

    f@eze

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

    1394/04/29
    03:20
  11. Avatar

    مهمان

    مهرداد

    اقا ممنون عالی بود

    1394/04/28
    11:12
    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      yes

      1394/04/28
      11:15
  12. Avatar

    مهمان

    محمد حسين

    سلام محتوای سایت بسیار عالی است واز وقتی که میگذاری تشکر میکنم.
    از اىنجا به بعدش رو خواستی سانسورش کن
    چند جا دیدم نوشتی ” دو هزاریتون افتاد” راستش مثل هر ضرب المثل واصطلاحات رایج اینم برأی خودش داستانی داره واونم اینه که اون قدیما تلفن های عمومی بجای کارت با سکه پول کار میکردن یعنی گوشی رو برمیداشتیم یه دو ریالی تو قلکش می انداختیم تا صدای بوق آزاد می آمد و میتونستی شماره تو بگیری وقتی طرف مقابل گوشی رو بر می داشت دو ریالی به داخل قلک می افتاد وارتباط برقرار می شد اگه بوق اشغال می آمد قلاب گوشی رو فشار میدادی و سکه رو پس میگرفتی. گاهی أوقات بدلیل میکانیکی بودن سیستم سکه گیر میکرد و نمی افتاد تا ارتباط برقرار بشه یا در صورت اشغال بتونی سکه رو پس بگیری!البته بیشتر وقت ها یه مشت محکم کار ساز بود.پس افتادن سکه نشانه برقراری ارتباط بود .بچه تهرونی ها با لهجه خودشون به دو ریالی میگن دوزاری؟!!ما ما میگفتیم دو قِرانی!؟ و این اصطلاح رایج شد که آیا طرف مطلب رو گرفته پس معلومه دوزاریش افتاده.امیدوارم دوزاری شما هم افتاده باشه و بدونی از هر رده سنی و از هر کجای ایران بازدید کننده دارید.موفق باشید

    1394/04/25
    05:52
    • مهدی دمرچیلو

      نویسنده این مطلب

      مهدی دمرچیلو

      سلام
      laugh
      دمت گرم داش….نمیدونستم blush
      راستی نمیدونستم بچه تهرونی ها لحجه دارن….. laugh

      1394/04/25
      11:35
  13. Avatar

    مهمان

    mohamad

    ببخشید یک سوال داشتم می خواستم بدونم تو آردوینو به چه صورت می شه فایل hex را به دست آورد.مرسی از سایت خوبتون

    1394/04/17
    03:02