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

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

به نام خدا

آموزش جامع آردوینو جلسه 6 : بازم سلام ، تو این مطلب آموزش آردینو ( آموزش آردوینو mosking) میخوام مبحث ارتباط سریال در آردینو رو انشاالله میخوام بقیه توابع رو بگیم(و مطلب رو تموم کنم)؛ پروژه آردوینو هم بمونه برا جلسه بعد.(البته پروژه برا توضیح کد ها رو گزاشتم؛ پروژه چیز منظورم بود crazy )
آموزش جامع آردوینو جلسه 6

خب خب خب، بریم سراغ مطلبمون، تو این مطلب توابع رو کمتر توضیح دادم چون متاسفانه چیزی نداشت که بخوام بگم و مطلب رو الکی طولانی کنم و شما رو اذیت کنم؛ هر چند که این مطلب 1800 کلمه هستش( bomb) و بزرگترین مطلب این 5-6 جلسه هستش ولی به نسبت تعداد توابعی که توی این مطلب گفتم، حجم مطلب نسبت به مطالب قبل کمتره shout …………بیکاری داری این چرت و پرت های منو میخونی ها….برو توابع زیر رو بخون برادر من برو….برو توبه کن….برو crazy
از شوخی بگذریم اگه جاییش رو متوجه نشدید حتما سوال کنید. blush
 

Serial.readString
Serial.readString : تو تابع Serial.read ما تک بایت تک بایت(تک کاراکتر تک کاراکتر) اطلاعات رو دریافت میکردیم ، تو تابع Serial.readBytes یه عددی مشخص میکردیم تا به اون اندازه کاراکتر(بایت) دریافت کنه؛ اما تو تابع Serial.readString هر تعداد بایت(اطلاعات) که در serial buffer موجود باشه رو یکجا دریافت میکنه.

 

سوال : serial buffer چیه؟؟؟
جواب : همون طور که تو جلسه 4، تو توضیح تابع Serial.available گفتم ، این تابع اطلاعات رو در یه بافرری به نام بافر سریال(serial buffer) ذخیره میکنه.
 
یه مثال از این تابع

 
Serial.readStringUntil
Serial.readStringUntil : این تابع مثل تابع Serial.readString هستش، فقط با این تفاوت که اطلاعات رو میخونه وقتی خوندن اطلاعات رو متوقف میکنه که به کاراکتر مشخص شده(character) برسد.

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

 
Serial.find
Serial.find : کار این تابع اینه که یه رشته(و نه یه کاراکتر) بهش میدی و بافر سریال رو میخونه و اگه پیدا کرد اون رشته رو، خروجی تابع 1 میشه و اگه پیدا نکرد خروجی تابع 0 میشه.(خروجی تابع از نوع bool هستش.)

target : متن(رشته) ما که تابع Serial.find در به در دنبابلش هستش laugh
 
تو مثال زیر تابع به دنبال کلمه "ali" هستش.

 
Serial.findUntil
Serial.findUntil : والا این طور که من فهمیدم و تست کردم(تا مطمئن بشم) کار این تابع اینه که به دنبال یه رشته(target) میگرده و اگه پیدا کرد "1" رو بر میگردونه و اگه پیدا نکرد "0" برمیگردونه، حالا اگه سر راه جستوجو کردنش به رشته تعیین شده(terminal) برسه عملیات جستوجو رو متوقف میکنه.

 
مثال زیر رو ببیند؛ در زیر هم توضیحش میدم تا بهتر متوجه بشید :

 
Serial.flush
Serial.flush : اون طوری که فهمیدم= منتظر ماندن برایای این که دیا کاملا ارسال بشه.
یه مطلب خوب که این تابع رو توضیح داده : When do you use the Arduino’s Serial.flush

 
serialEvent
serialEvent : وقتی فراخوانی میشه که دیتایی در دسترس باشه، که به صورت زیر هستش(میتونید قبل SETUP و LOOP و بعد از تعریف متغییر ها قرارش بدید مثل مثال زیر)

 
مثال زیر رو هم ببینید : تو این مثال طبق روان معمول اول sETUP اجرا میشه و بعد LOOP  و وقتایی که دیتایی در دسترس باشه کد های داخل این تابع اجرا میشن.

 
البته پروژه بالا رو هم میتونیستیم به صورت زیر(مثل پروژه های جلسات قبل) بنویسیم.....بشینید و فک کنید که هر کدوم کجا ها ممکنه به کار بیاد.(برا این میگم تا تحلیل برنامه نویسیتون خوب بشه، البته عملکرد پروژه زیر و بالا هر دو یکسان هستش.)

 
Serial.write
Serial.write : تو این تابع میتونیم هم یه رشته(چند تا کاراکتر مثلا "ali") ارسال کنیم(تابع وسطی کد زیر) ، میتونیم یه کد اسکی ارسال کنیم(کد اسکی رو تو جلسه 4 یا 5 فک کنم گفتم یه لینکی گزاشتم)(تابع اولی کد زیر) و هم میتونیم تعداد تعیین شده از خونه های یا آرایه(از نوع char) رو ارسال کنیم(تابع آخر کد زیر)؛ در زیر 3 حالت ممکن این تابع ر ومیبینید

val : یه عدد صحیح یا یه متغییر از نوع int....این عدد صحیح باس بین 0 تا 255 باشه که در واقع همون کد اسکی هستش.
string : رشته ای که قراره ارسال بشه.
length : طول, تعیین تعداد خونه های آرایه که قراره مقادرشون ارسال بشه.
buffer : آرایه ای(از نوع char) که قراره ارسال بشه.
مثلا زیر رو هم ببینید :

 
(if (Serial
(if (Serial : والا تا جایی که فهمیدم برا برد های UNO کاربردی نداره و برا برد های LEONARDO کاربرد داره، حالا دوستان اگه اطلاعات بیشتری دارن در اختیار ما بزارن.
و اگه اشتباه گفتم هم لطفا ذکر کنید.
 
Serial.peek
Serial.peek : این تابع به صورت زیر هستش و کارش "زیرچشمی نگاه کردن اطلاعات هستش pardon " ؛ یعنی اطلاعات روی serial buffer رو میخونه بدون این که اطلاعاتش از بین بره؛ اگه توجه داشته باشید مثلا وقتی اطلاعات رو از serial buffer توسط (مثلا) تابع Serial.read میخوندیم، بعد خوندن اطلاعات توسط این تابع، اون اطلاعات از serial buffer پاک میشدن(دلیلش هم معلومه)؛ کلا توابعی که تا حالا گفتم و کارشون خوندن اطلاعات بود بعد این که اطلاعات رو میخوندن اون اطلاعات از serial buffer پاک میشد؛ اما تو این تابع این طور نیست و بعد از خوندن اطلاعات ؛ اطلاعات از serial buffer پاک نمیشن؛ به همین دلیله که اسم تابع رو گزاشتن peek

 
در زیر یه مثال از این تابع گزاشتم براتون برا تفهمیم هر چه بهتر این تابع heart

تو این پروژه میخوام نشون بدم که وقتی از تابع peek استفاده میکنیم اطلاعات پاک نمیشن ولی وقتی از read استفاده میکنیم اطلاعات پاک میشن و در دفه ی دوم که میخوامی دوباره با تابع read اطلاعات رو بخونیم به مشکل بر میخوریم چون میقوع نمایش اطلاعات میبینیم که داره چرت و پرت نمایش میده(این بود هدف این پروژه mosking ) >>> حواستون باشه که موقع اجرای پروژه فقط یه کاراکتر وارد کنید تا عملکرد پروژه رو ببینید.

 
Serial.setTimeout
Serial.setTimeout : این تابع جالب ترین تابعی هستش تو این قسمت؛ مثلا فک کنید دارید اطلاعات رو وار میکنید، اطلاعات مثلا یه کد 20 رقمیه crazy  حالا شما میاین رقم رقم اطلاعت رو ارسال میکنید، حالا بین دو رقمی که ارسال میکنید مطمئنا یه تاخیری وجود داره، مثلا بین هر دو رقم برای ارسال 2 ثانیه فاصله وجود دارد، حالا اگه از یکی از توابع زیر استفاده کنید، مثلا Serial.readBytes ، تو حالت عادی اگه پروژه رو اجرا کنیم ممکنه هر رقم رو یه اطلاعات در نظر بگیره، ولی ما میخوایم که کل این 20 تا رقم  رو به عنوان یه دیتا دریافت کنه و نه به عنوان 20 تا دیتا rtfm....اصلا شاید هم طرف مشکل داشت و فاصله زمانی بین هر رقم ارسالش 2 ثانیه بود ، یا اصلا مریض بود و کرم داشت و اطلاعات رو با فاصله زمانی زیاد ارسال میکرد(یا به هر دلیل دیگه ای) ما باید کاری کنیم که اطلاعات به صورت یکجا دریافت بشن(اووووووووووووف چه رمانی گفتم mosking ) ، برا این کار میایم از تابع Serial.setTimeout استفاده میکنیم.
Serial.readBytesUntil , Serial.readBytes , Serial.parseInt , Serial.parseFloat
 
تابع Serial.setTimeout به صورت زیر هستش:

که به جای time میزان تاخیر زمانی مورد نظرمون رو وارد میکنیم، مثلا در بالا حداقل به 2 ثانیه(برا هر رقم) نیاز داریم، لذا ما مثلا عدد 5 ثانیه رو وارد میکنیم(برا اطمینان) و حواستون باشه که time رو باید بر حسب میلی ثانیه بنویسید، یعنی به جای time باید بنویسید 5000.
 
توجه : حالت دیفالت(تو حالت عادی) مقدار این تابع 1 ثانیه هستش.(یعنی وقتی از این تابع استفاده نکنی) >> فاصله بین هر دو رقم ارسالی 1 ثانیه هستش
 
پروژه زیر رو هم ببینید....یه بار خط 7 رو بزارید باشه و یه بار حذفش کنید(به صورت توضیحات درش بیارید) و در هر دو حالت پروژه رو اجرا کنید تا عملکرد دو پروژه رو کاملا احساس میکنید.

خودمو کشتم تا به ساده ترین و بهترین روش توضیح بدم این تابع رو، امیدوارم قشنگ متوجه شده باشین این تابع رو. cry

 
parseInt و parseFloat
parseInt : این تابع تو serial buffer میگرده و فقط اعداد صحیح رو میخونه(مثلا اعداد 2.5 رو 2 میبینه)
parseFloat : این تابه هم مثل تابع بالا, فقط دنبال اعداد اعشاری هستش؛ البته اعدادی مثل 1و2و3 و.... رو به صورت 1.00 و 2.00 و3.00 و... میبینه.

 
مثال زیر رو ببینید(بعد از اجرا مقدار مقابل رو وارد کنید "1mahde2ali3reza4mohammad5" )

 
serialEvent
خب اگه بخواین دیتا رو از طریق وقفه دریافت کنید باید از تابع serialEvent تو پروژتون استفاده کنید، هر موقع دیتایی دریافت بشه این تابع فراخونی میشه، مثال زیر رو ببیند :

 
منبع این قسمت : SerialEvent

 
مردونه دوستان بیایم یه قولی بدیم؛ دیشب هم شب آخر قدر بود(که انشاالله ما رو هم دعا کردین)؛ این که هر چی یاد گرفتین(هر چقدر هم کوچولو) بیایم و به دیگران یاد بدیم و دریغ نکنیم؛ والا اگه با این کار دانسته هاتون کم بشه، یه به قول بعضیا به طرف چیزایی که بلدم رو یاد بدم بعدا طرف میشه رقیبم shock  و از این چرندیاتی که بعضیا میگن؛ خداییش وقتی به طرف میای یاد میدی این اون نیست که یاد میگیره بلکه این تویی که یاد میگیری مشکلاتت رو و چیزایی که بلد نیستی رو……جدی میگم…این تجربه منه…..چون موقعی که میخوای یاد بدی به طرف چیزی رو…..میای و مثلا انواع حالاتی که ممکنه رخ بده، همه ی استثنا ها رو در نظر میگیری و اون وقت میای میبینی که ای بالا….این قسمتش رو که بلد نیستم یا اگه بلدم اشتباه بلدم و…. >>>>> در ضمن تو اسلام هم توصیه شده>>>>زکات علم و ملم >>>>فک کنم همتون شنیده باشین >>>> حالا از ما گفتن bomb
خوب بابا بزرگ بازی بسه…..راستی نظرا فراموش نشه…..دعا برا ظهور حضرت و صلوات برا شادی روح شهدا و دعا برا سلامتی رهبر و علمای دین فراموش نشه(اینا هزینه این مطلب ناچیز هستش)
اگه جایی رو اشتباه گفتم لطفا بگید ، سوالی بود در خدمتیم
فعلا تا مطلب بعد یا علی

گروه پرسش و پاسخ الکترونیکی در سروش
مهدی دمیرچیلو
ارسال دیدگاه
74

1) نظرات غیر فارسی به صورت خودکار حذف میشوند ( حداقل 5 حرف فارسی وارد کنید ).

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

3) برای گزاشتن کدهاتون از این سایت استفاده کنید ( طبیعتا لینک کدتون رو باید برای من بفرستید! ) : debian

4) پسورد فایل های سایت : www.dmf313.ir

  1. Avatar

    مهمان

    علیرضا

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

  2. Avatar

    مهمان

    شاهین

    سلام مهندس خیلی ممنون بابت توضیحات خوبی که می دی اجرت با امام حسین
    فقط یه سوال
    آقا چه زمانی تابعserialavailable داخلش اطلاعات میاد؟

    • مهدی دمیرچیلو

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

      مهدی دمیرچیلو

      سلام.زمانی که دیتای دریافت میشه.

  3. Avatar

    مهمان

    عبدالله

    سلام شرمنده مزاحم شدم
    من عملکرد تابع write رو متوجه نمیشم اگر ممکن است سا ده تر بگید
    همچنین ایا کار تابع serial.parseInt شبیه readاست با این تفاوت که فقط اینتیجر میگیره؟

    • مهدی دمیرچیلو

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

      مهدی دمیرچیلو

      سلام
      تابع Serial.write برای ارسال داده بکار میره که داخل کتابخونه آردوینو به 3 صورت که توضیح داده شد، تعریف شده –
      1.شما میتونید یه متغییر از نوع کاراکتر بهش بدید تا یک کاراکتر رو ارسال کنه
      2.میتونید یه متغییر از نوع String بدید تا همشو ارسال کنه.
      3.میتونید یه آرایه کاراکتری بهش بدید و بگید که n خونه اول رو ارسال کن

      تابع serial.parseInt هم کارش اینه که تو بافر مربوط به دیتا های دریافتی میره دنبال اعداد صحیح میگرده و بهمون میده – چیز کاربردی نیست به اون صورت.

  4. Avatar

    مهمان

    saniee

    سلام جناب دمرچیلو
    من می خواستم اعداد 0 تا 360 را از اردینو مگا به سیمولینک متلب ارسال کنم و در سیمولینک با بلوک serial reciveاعداد را دریافت کنم
    دستورات serial.print و serial.writeرو امتحان کردم
    فقط با دستور serial write اعداد بصورت صحیح در سیمولینک دیده می شود
    ولی مشکل اینجاست که با این دستور محدوده اعداد ارسالی بین 0 تا 255 بوده و ارقام بعد از 255 را از صفر شروع می شود
    خواهشمندم راهنمایی فرمایید چطور می تونم با دستور serial.write ارقام بیشتر از 255 رو ارسال نمایم
    با تشکر

    • مهدی دمیرچیلو

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

      مهدی دمیرچیلو

      سلام
      مشکل شما اشتباه در فرمت ارسال و دریافت هستش
      همونطور که میدونید هر کاراکتر ( 1 2 3 A a B b C c ! @ # و… ) دارای کد اسکی هستن ( سرچ کنی جدول کد اسکی رو میتونی ببینی ) و هر کاراکتر یه کد اسکی مخصوص به خودشو داره – مثلا کد اسکی کاراکتر 0 عدد 48 هستش ( تا جایی که یادمه ) – شما در قسمت ارسال و دریافت باید از توابع یکسان استفاده کنید – یعنی اگه کاراکتر میفرستید – کاراکتر بخونید – نه این که کاراکتر بفرستید و string و یا عدد بخونید.

  5. Avatar

    مهمان

    سیامک

    بسیار عالی-ممنون از اموزش های خوبتان.

  6. Avatar

    مهمان

    اکبر

    کارتون درسته خدا قوت

  7. Avatar

    مهمان

    سید

    سلام اقای دمرچیلوی عزیز ممنون از پاسخ سریعتون اما بعد : بنده میخوام رشته زیر رو که از کامپیوتر میاد رو توسط اردینو شناسایی کنم
    ۷E 45 46 03 04 B0 00 64 00 C8 05 DC 00 00 00 00 00 00 00 50 00 45 45 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 91 7E
    این رشته ۶ بار از پورت سرال با سرعت ۴۸۰۰ وزمان ۵۰۰ms بین هر بار ارسال دیتای بین ۷E ها میتونه تغییر کنه در جواب این رشته اردینو
    این رشته روبا همون ۴۸۰۰ مکرر ارسال کنه :
    ۷E EC FF 98 08
    طوریکه بشه در این حال مقدلر ECFF رو بایه ولوم کم وزیاد کرد و مقدار ۹۸ ۰۸ رو هم بایه ولوم دیگه
    در نهایت شرمنده شما هستم تا هر جا که راه داره برام توضیح بدید ممنون میشم

    • مهدی دمرچیلو

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

      مهدی دمرچیلو

      متوجه منظورت نمیشم – خب این دیتا رو گرفتی – بعد میخوای چیکار کنی؟ خب مثلا اینا تو یه آرایه ذخیره میشه و شما دنبال ۴۵ هستید – خب یه if مینویسید که کل آرایه رو اسکن میکنه

      • Avatar

        مهمان

        سید

        مهندس جان همین تیکه اول رو میتونی کدش رو برام بنویسی که رشته ورودی سریال داخل یه ارایه قرار بگیره حتما متوجه شدین رشته هگز که میاد ۶ بار تکرار میشه( جهت بالا بردن صحت اطمینان ارسال دیتا) اما دیتای مورد نیاز ما بین {۷E…7E} یکی از این رشته هاست .
        بی نهایت از شکیباییتون سپاسگذارم

        • مهدی دمرچیلو

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

          مهدی دمرچیلو

          خب چه کاریه – دیتا رو به صورت زمان بندی اگه میفرستی به میکرو – خب میکرو هر دیتایی طبق فرمت تعریف شده براش نبود رو ندید میگیره – چکاریه که ۶ بار میفرستید.

  8. Avatar

    مهمان

    سعید

    سلام
    ینی اردوینو با این عظمتش فکر وقفه نبوده؟و هیچ وقفه ای تو ارتباط سریال نداریم که مثه بچه ادم کار کنه؟!!!!!!!

  9. Avatar

    مهمان

    سعید

    سلام و درود
    ضمن تشکر از زحماتت سوالی داشتم.دستور serialEvent شبیه وقفه سریال در avr عمل می کنه؟
    با تشکر

    • مهدی دمرچیلو

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

      مهدی دمرچیلو

      سلام – داره – ولی من کار نکردم

  10. Avatar

    مهمان

    arian

    سلام آقا اونجوری که من فهمیدم با serial.print انگار میشه فقط کاراکتر فرستاد و با serial.write همونجری که خودتون گفتید یا string یا int یا کد اسکی ؟ درس میگم یا با serial.write هم میشه یک کارکتر فرستاد؟

    • مهدی دمرچیلو

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

      مهدی دمرچیلو

      سلام – print برا ارسال یه سری کاراکتر هستش ( string ) و write برای ارسال یه تک کاراکتر هستش.

      • Avatar

        مهمان

        arian

        آخه من الان با Serial.write همونطور که خودتونم فرستادید یه عبارت مثل “dmf” (رشته) فرستادم که می فرسته کارکترم میفرسته مثل ‘a’ البته الان یه سوال دیگه دارم الان من آردویینو مگا دارم و وقتی از Serial استفده می کنم هم تو monitor خود آردویینو هم با برنامه ی ترمینال سریالی که خودتون نوشتید خروجی رو می بینم ولی از Serial1 یا Serial2 یا ۳ استفده میکنم نه تو ترمینال آردویینو چیزی نشون میده نه نرم افرای دیگه

        • مهدی دمرچیلو

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

          مهدی دمرچیلو

          چون فقط Serial با مبدل به کامپیوتر وصل شده – تو خروجی آردوینو هستش – برا ۳ تای دیگه باید از مبدل usb to ttl استفاده کنی که مطلبش تو سایت هستش
          بسرچ : cp2012 اسمش باید این باشه

  11. Avatar

    مهمان

    arian

    سلام آقا مهدی الان تو آردویینو از serial.write برا نوشتن (فرستنده) و از توابع serial.read و امثالهم برا خوندن ( گیرنده)استفاده میشه
    حالا اگه بخوایم از آردوینو بفرستیم و از میکرو بخونیم باید از putchar و getchar استفده کرد دیگه؟ مشکلی که آردوینو با putchar نداره؟

    • مهدی دمرچیلو

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

      مهدی دمرچیلو

      سلام-منظورت اینه که بین آردوینو و AVR ارتباط برقرار کینی با کدویژن؟ درسته اسم توابع تو آردوینو و کدویژن ( یا اتمل استدیو و …) یکم فرق داره ولی کدهای داخل این توابع یکیه – لپ کلوم این که ظاهر این توابع فرق داره – باطنشون یکی هستش – مشکلی ایجاد نمیکنه – فقط شما وقتی CHAR میفرستی باید CHAR هم بگیری- یعنی وقتی از serial.write در سمت آردوینو استفاده میکنی که کارش ارسال یه تک کاراکتر هستش باید در سمت AVR هم از تابع getchar استفاده کنی که کارش دریافت یه کاراکتر هستش و…

  12. Avatar

    مهمان

    محمد

    سلام
    من از طریق سریال یه کدی رو مثلا ۱۲۳۴ دریافت کردم و توی یه متغیر String ریختم حالا میخوام این مقدار رو توی برنامه آخرش یه چیزی اضافه کنم مثلا # یعنی میخوام مقدار دریافتیم بشه #۱۲۳۴ چه جوری با چه دستوری میتونم این کار رو انجام بدم؟؟
    برای یه دستور شرطی میخوام
    میخوام تعریف کنم اگه کد دریافتی مقدار اصلی بود فلان کار رو انجام بده ولی اگه # بهش اضافه شده بود یه کار دیگه انجام بده

    • مهدی دمرچیلو

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

      مهدی دمرچیلو

      سلام
      اگه از STRING استفاده کردی – تو نت بزن – کتابخونه و توابع sTRING رو میراه برات… تابع مد نظر رو پیدا کن و استفاده کن.

    • Avatar

      مهمان

      محمد

      توی این سایت
      https://goo.gl/MeBi8O
      در موردش نوشته که با دستور Insert میشه رشته ای را در مکان خاصی از رشته دیگر اضافه کرد. به نظر همین به کارم بیاد ولی مشکلی که هست اینه که ننوشته چه جوری باید توی برنامه ازش استفاده کرد و کدش رو نوشت توی گوگل سرچ کردم اما چیز درستی نفهمیدم یه راهنمایی کوچیک بهم بکنی ممنون میشم

  13. Avatar

    مهمان

    رشید

    آقا مهدی سلام
    تابع من اینجوری شد peak با یه تقییر کوچیک تو مثال تابع
    char my_data1, my_data2, my_data3, my_data4;
    int i=0;
    void setup()
    {
    Serial.begin(9600);
    }
    void loop()
    { if (Serial.available() > 0)
    {
    my_data1 = Serial.peek();
    my_data2 = Serial.read();
    my_data3 = Serial.read();
    my_data4 = Serial.read();/////////////////////////////
    Serial.print(i++);//////////////////////////
    Serial.print(my_data1);
    Serial.print(my_data2);
    Serial.print(my_data3);
    Serial.println(my_data4);///////////////////////////
    }
    }
    را بفرستیم نتیجه این میشهasd وقتی که یه رشته مثل
    0aaےے
    1ssےے
    2ddےے
    حالا مشکل اینه که حلقه بار اول که اجرا میشه
    serialread
    دوم و سوم باز هم خانه اول بافر را میخونند تا اینکه دور دوم حلقه بافر اول پاک بشه و …
    حالا با این تغییر
    my_data1 = Serial.peek();
    Serial.flush();
    my_data2 = Serial.read();
    my_data3 = Serial.read();
    my_data4 = Serial.read();
    نتیجه:
    0aaےے
    1ssdے
    و این:
    my_data1 = Serial.peek();
    my_data2 = Serial.read();
    my_data3 = Serial.read();
    Serial.flush();
    my_data4 = Serial.read();
    نتیجه:
    0aaےے
    1ssےd
    اینجوری که واقعا دردسره ، هر دفعه یه جور میشه ، این قضیه وقفه داخلی سریال خوشم نیومد اصلا !!!!

    • مهدی دمرچیلو

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

      مهدی دمرچیلو

      کدت رو زیپ کن و لینکش رو بزار همینجا و دقیقا بگ کجاش مشکل داری.

      • Avatar

        مهمان

        رشید

        https://drive.google.com/open?id=0B_kXyLQgcHHmYVZpRHJfc1lhOFE
        مشکل جای خاصی نیست ، یه برنامه تستی ه
        میگم که با تغییر جای
        Serial.flush();
        در برنامه و اگه یه رشته سریال ارسال کنیم برنامه کاملا غیر قابل پیش بینی میشه!!

        • مهدی دمرچیلو

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

          مهدی دمرچیلو

          شما دیتا رو میخونی – اگه دیتای مد نظرت بود یا نبود فلش میکنی.
          مثلا فرمت دیتات ۱۰ بایتی هستش – ۱۰ بایت دیتا دریافت میکنی و بعد اگه اون چیزی که میخواستی بود یا نبود – بعد از بررسی دیتا – میای فلش میکنی
          روال کار به این صورته.

  14. Avatar

    مهمان

    نیما

    نفهمیدم الان دقیقا باید چی کار کنم ؟

    • مهدی دمرچیلو

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

      مهدی دمرچیلو

      خب خودت گفتی دیگه – یه led سر مثبتش رو بزن به پایه دیتا و با یه مقاومت هم سری کن و ته مقاومت هم به زمین
      میشه 2 تا led – یکی برا tx و یکی برا rx

  15. Avatar

    مهمان

    نیما

    ای بابا همون سریال دیگه دو سه تا پست پایین رو دوباره بخونید

    • مهدی دمرچیلو

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

      مهدی دمرچیلو

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

  16. Avatar

    مهمان

    نیما

    اقا مهدی جواب منو نمیدید؟

    • مهدی دمرچیلو

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

      مهدی دمرچیلو

      کدوم سوال؟

  17. Avatar

    مهمان

    نیما

    من توی ذهنم این.هست.که.ارتباط سریال یعنی همون تبادل صفر و یک و این صفر و یک ها در واقع همون روشن خاموش شدن های ال ای دی میتونه باشه درسته؟
    ارتباط سریال من ارتباط اردوینو با ماژول rc522

  18. Avatar

    مهمان

    نیما

    آقا مهدی چطوری میشه کاری کرد که وقتی اطلاعات داره از طریق سریال رد و بدل میشه یک ال ای دی بذارم و اون ال ای دی چشمک بزنه که کاربر بفهمه سیستم در حال انتقال اطلاعات هست؟

    • مهدی دمرچیلو

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

      مهدی دمرچیلو

      خب به نظرم یکم درباره قرمت داده سریال تحقیق کن خودت متوجه میشی.
      ولی خب بستگی به مدارت هم داره
      الان ارتباط سریال – ارتباط میکرو با چی هستش؟

    • Avatar

      مهمان

      SAEID

      سلام
      عزیز درسته که ارتباط سریال ینی ۰ و۱ ها ولی باید اینم در نظر داشت کهچشم ما بیشتر از فرکانس ۵۰ رو نمیبینه جه برسه به فرکانس کیلو و مگا هرتز… وقتی شما از ال ای دی استفاده کنی ینی مستقیما به usart وصل کنی ال ای دی همیشه روشنه اما نه پر نور.
      واسه کارت باید بعد هر رسته یه تاخیر زمانی بذاری بعد دستور روشن خاموش کردن ال ای دی رو بدی.
      البته این چیزیه که من از سوالت فهمیدم

  19. Avatar

    مهمان

    محمد

    سلام.
    داداش این آردوینو مثل میکروکنترلر وقفه بافر دریافت نداره یعنی برناممون اجرا بشه وقتی دیتا دریافت شد سریع بره تو وقفه .

    • مهدی دمرچیلو

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

      مهدی دمرچیلو

      سلام – داره.

      • Avatar

        مهمان

        محمد

        خب داداش کجاس. چجوری میشه استفاده کرد

        • مهدی دمرچیلو

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

          مهدی دمرچیلو

          الان به مطلب اضافه میکنم – تا ساعت 3 فک کنم تموم بشه شاید هم زود تر.

          • مهدی دمرچیلو

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

            مهدی دمرچیلو

            تموم شد laugh ، قسمت serialEvent رو ببین.

          • Avatar

            مهمان

            محمد

            داداش دمت گرم ولی تو serialEvent کدای داخل حلقه loop اجرا میشن بعد که به اخر رسید میره تو تابع serialEvent .
            وقفه ای نداره مثل کدویژن به محض اینکه دیتا اومد برنامه رو هرجا که هست ول کنه بره تو وقفه بعد بیاد به ادامه برنامه.

          • مهدی دمرچیلو

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

            مهدی دمرچیلو

            طبق توضیحات بالای تابع serialEvent این حرفو زدی یا تست هم کردی؟
            بزار یه تابه دیگه هستش دقیقا مخصوص این کار – پیدا میکنم و پیوست میکنم.

          • مهدی دمرچیلو

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

            مهدی دمرچیلو

            کد زیر رو تست کن و نتیجه رو بگو – هر دیتایی که دریافت کنی میکرو همونو ارسال میکنه – تست کن و نتیجه رو بگو – باید جواب بده – تست کردی بگو تا پیوست کنم به سایت بقیه هم استفاده کننن.
            void setup() {Serial.begin( 9600 );}
            void loop() { }
            ISR(USART0_RX_vect) {Serial.write( Serial.read() );}

          • Avatar

            مهمان

            محمد

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

          • مهدی دمرچیلو

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

            مهدی دمرچیلو

            جهنم ظرر – بیا از وقفه خود Avr استفاده کن.

          • Avatar

            مهمان

            محمد

            متوجه نشدم. یعنی بیام از وقفه کدویژن اینجا استفاده کنم؟

          • مهدی دمرچیلو

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

            مهدی دمرچیلو

            به جای وکتور قبلی USART_RXC رو قرار بده

          • Avatar

            مهمان

            محمد

            نمیشه.هر کار میکنم نمیره تو وقفه داداش خودت یبار تست کن ببین.راهی است برای این کار.

          • مهدی دمرچیلو

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

            مهدی دمرچیلو

            پروژت رو زیپ کن بفرست ببینم چیه اصلا.

          • Avatar

            مهمان

            داود

            سلام آقا دمت گرم . سایت ردیفی داری
            من هم دنبال گرفتن سریع اطلاعات سریال هستم و مشکلم اینه که اول باید دستورات loop انجام شه بعد می ره تو تابع سریال. اگر راهی هست که هر جای از برنامه بود وقتی داده رو سریال بود برنامه پرش کنه رو تابع سریال
            بعد سوال دوم من این بود که سریع ترین روش خودن داده از سریال برای آردینو چیه من با Serial.readStringUntil می خونم آیا روش های دیگه سریع تر هستند ؟ یا خیر؟

          • مهدی دمرچیلو

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

            مهدی دمرچیلو

            سلام
            باید از وقفه استفاده کنی.

          • Avatar

            مهمان

            محمد

            نه تست کردم

  20. Avatar

    مهمان

    رضا

    عالی دمت گرم

  21. Avatar

    مهمان

    حامد کاظمی

    سلام مهدی جان آقا دستتدرد نکنه خسته هم نباشی. حقیقتش من میخوام چندتا سنسور رطوبت و دما رو از طریق پین SDA به اردونیو وصل کنم میشه راجع بهاون هم توضیح بدی؟

    • مهدی دمرچیلو

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

      مهدی دمرچیلو

      سلام
      خب نرم افزاری یا سخت افزاری آموزشش رو بدم؟
      نرم افزاری رو هر دو پایه ای از میکرو میتونی استفاده کنی-سرعت کار کنتر
      سخت افزار هم رو پایه های ۴-۵ آنالوگ فک کنم اتچ شده باشه پایه های sda و sca فک کنم اشماشون همینا بود
      تا امشب سعی میکنم یه مطلب و یه پروژه نمونه بزارم(فک کنم ماژول با ارتباط ۲ سیمه داشته باشم)
      ولی قول نمیدم….ولی از همین الان شروع میکنم به کارش تا شب یه مطلب دربارش بزارم تو سایت

  22. Avatar

    مهمان

    سجاد

    سلام
    ممنون که جواب دادی
    یه سری چیزا با خوندن مطالب مفید سایتت در مورد بیت فهمیدم ولی من فقط با دیدن مثال یاد میگیرم
    ببخشید،میشه یه مثال کوچولو با دوتا pwm (یا حتی یکی)برام بزنی لطفا؟

    • مهدی دمرچیلو

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

      مهدی دمرچیلو

      سلام
      نه
      خودت بنویس بده ببینم
      و مشکل اگه داشت بهت بگم

  23. Avatar

    مهمان

    سجاد

    سلام اقا مهدی.واقعا خسته نباشی
    من دارم رو سریال وpwm کار میکنم ولی یجا بدجور گیر کردم
    من میخوام با سریال ۴ تا پایه pwm رو کنترل کنم ولی من فقط کنترل یدونشو بلدم
    مثلا میخوام این کدو بفرستم تا بره تو متغیر یک:A1023 یا اینو بفرستم بره تو متغیر دو:B1023 و…
    ولی نمیدونم چجوری اینکارو کنم
    خواهش میکنم راهنماییم کن،خیلی واسم حیاتیه این موضوع

    • مهدی دمرچیلو

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

      مهدی دمرچیلو

      سلام
      یه روش که الان تو ذهنمه اینه…یه کد ۱۶ بیتی=۲ بایتی ارسال کن که ۸ بیت دیتای تو هستش و ۸ بیت تعیین این که تو کدوم متغییر باید ذخیره بشه
      با این روش میتونی ۱۶ نوع مختلف دیتا ارسال کنی
      ok?

  24. Avatar

    مهمان

    راضی بانو

    مرسی از مطالب کاملتون فقط من یک جا عبارت زیر را دیدم می خواستم توضیحشو هر چی زودتر بدید خیلی نیاز دارم
    serial.write(0x0A(;
    کلا میشه بگید اینها چی هستن ؟
    (۰x1A)
    (۰x0D)
    (۰x0A)

    • مهدی دمرچیلو

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

      مهدی دمرچیلو

      سلام
      والا این روش مقدار دهی هستش….مثلا ۱۰-۲۰٫٫٫٫مثلا میگن فلانی نمره اش ۲۰ شد….این فرم عدد بر مبنای ۱۰ دهی هستش
      حالا اعداد بر حسب باینری هم دارم….مثلا باینری عدد ۴ میشه ۱۰۰
      این عدد ها و مقادیری که شما گزاشتی و با ۰x آغاز میشن به اینا میگن اعداد هگزا دسیمال….تو نت سرچ کنی یه آموزش خوب دربارش هستش…..سایت خیلی سبز فایلش رو درست کردم-pdf

  25. Avatar

    مهمان

    مهدی

    اقا یه چیزی یادم رفت
    شما لایبرری های اینگلیسی رو می خونی متوجه می شی تابع هاشو یا توی نت سرچ می کنی فارسیش پیدا می شه توی خود سایت اصلی اردینو حتی کامل کامل نبود شایدم من خیلی وقت نزاشتم
    یه چیز دیگرم اینکه به نزت چطوری یه برنامه اندروید بنویسم که بشه بلوتوث رو کنترل کنه شنیدم qt خوبه حالا نمی دونم از برنامه اپن سورس استفاده کنم مثلbt که متن بازه یا برم یه app براش یاد بگیرم بنویسم

    • مهدی دمرچیلو

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

      مهدی دمرچیلو

      والا منبع فارسی درست و درمونی برا آردوینو نیست
      همون اجنبی ها رو میخونم laugh
      والا خودمم هم تو فکرشم…..دارم C ایییم رو قوی میکنم هم برا دنیا و آخرتم خوبه و هم اگه قسمت شد یه سلامی هم بهQT بدیم ببینیم حالش چطوره…..
      والا بستگی به خودت داره…..ببین چقدر نیازته….بسته به اون راهت رو انتخاب کن…..طوری نشه که یه بار تو عمرت تو یه کار خرکی بخوای از یه چیزی استفاده کنی و بری سراغ بهترین روش
      و بیلعکس crazy

  26. Avatar

    مهمان

    مهدی

    سلام اقا دمت گرم وقت میزاری
    یه سوال توی کدویژن دیدی برای سریال اینتراپت جدا میزاری تا دیتا بیاد از برنامه اصلی می یاد بیرون میره انجام میده اینتراپت سریال روووووو
    ولی این آردینو من تابع هاشو هم نگا کردم اینتراپت سخت افزاری بیشتز گفتن
    یه دستوری قبلا گفتی serial.available بود ولی اونو می شه به عنوان اینتراپت نرم افزاری تعریف کرد؟؟؟؟
    ☻☺☻
    به قول قدیمیا بعد علی تو مردی..
    ☺☻☺
    راستی داش منم خیلی دوس دارم با سایتم باهات هم کاری الان در گیر پروژم ایشالا یه کم وقت آزادتر شد یه کارایی بکنبم
    دوست داشتی اینهelek.ir

    • مهدی دمرچیلو

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

      مهدی دمرچیلو

      سلام
      در ظاهر که میشه استقاده کرد
      مردونگی به این کارا نیست
      ما در خدمتیم
      خیلی خیلی خوبه که سایت های الکترونیکی داره زیاد میشه
      البته به شرطی که نرن تو کار CTRL+C و CTRL+V ……شما رو نمیگم….
      یه سایتی چند وقت پیش دیدم….آشغال ترین مطلبم رو کپی کرده بود و ته سایتش تو قسمت FOOTER نوشته بود laugh …بگذریم

  27. Avatar

    مهمان

    ziaee

    شاید باورتون نشه
    ولی این صفحه ای ک باز شد من تمام لینک هاشو یک دور خونده بودم
    مشکل من اینه ک تو پروژم هم تایمر دارم و هم nrt و این دو تا با هم کار نمیکنند
    یعنی تایمر بدون اینتراپ کار نمیکنه و nrf با اینتراپ کار نمیکنه
    کلا فکر کنم نوشتن برنامه با اینتراپ ی ذره متفاوته نه؟ unknw

    • مهدی دمرچیلو

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

      مهدی دمرچیلو

      تایمر و اینتراپت رو سعی میکنم مطالبش رو بزارم تو سایت

  28. Avatar

    مهمان

    ziaee

    سلام دوست عزیز
    خدا خیرت بده الهی
    خیلی مطالب خوبی میذاری
    من دارم ی پروژه کار میکنم با nrf و اردوینو
    میخواستم ببینم شما میتونی تو این راه کمکم کنی؟
    پروژه پایانی لیسانسمه

    • مهدی دمرچیلو

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

      مهدی دمرچیلو

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