آموزش آردوینو مدارهای الکترونیک

آموزش ارتباط سریال UART در بردهای Arduino – بخش پنجم

آموزش ارتباط سریال Arduino
نوشته شده توسط علیرضا قربانی

در این قسمت از آموزش قصد تکمیل کردن مبحث ارتباط سریال Arduino را داریم. در این پست به شرح توابع setTimeout ، write  و serialEvent می‌پردازیم. در ادامه با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.

 

Serial.setTimeout()

این تابع حداکثر زمان   برای منتظر ماندن دریافت اطلاعات از پورت سریال را مشخص می‌کند. توابع readBytes , readbytesUntil , readString , ReadStringUntil , parseFloat , parseInt  به طور پیش فرض از ۱۰۰۰ میلی ثانیه ( ۱ ثانیه ) برای منتظر ماندن دریافت اطلاعات از پورت سریال استفاده می‌کنند .ساختار کلی تابع به صورت زیر می‌باشد :

Serial.setTimeout(time);

 

به جای آرگومان time عددی بر حسب میلی‌ثانیه وارد می‌کنیم.

 

write()

 

به وسیله این تابع می‌توان یک عدد بین ۰ تا ۲۵۵ ، یک رشته و یا یک آرایه (همراه با تعیین طولی از آرایه که قصد ارسال آن را دریم)ارسال کرد.تفاوت این تابع با تابع print در جیست؟ تابع print  دیتا را به صورت کاراکتر ASCII ارسال می‌کند که باعث می‌شود دیتای ارسالی برای کاربر قابل خواندن و درگ باشد . ولی در مقایل تابع write اطلاعات را به صورت بایتو ناخوانا ارسال می‌کند. علت استفاده از تابع writeدر این است که بعضی از دستگاه‌ها دیتا را با فرمت بایت می‌خوانند. ساختار کلی تابع write به شکل زیر می‌باشد:

Serial.write(val);
Serial.write(str);
Serial.write(buf, len);

 

val : مقدار عددی یک بایتی که قصد ارسال آن را داریم.

str : یک رشته که قصد ارسال آن را داریم .

buf : آرایه‌ای از جنس []byte یا []char  که قصد ارسال آن را داریم.

len  : تعداد خانه‌های آرایه که قصد ارسال آن را داریم.

تابع write  تعداد بایت‌های ارسالی را برمی‌گرداند. مثال :

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

void loop()
{
  Serial.write(45); // یک بایت با مقدار عددی ۴۵ ارسال می کند
  int bytesSent = Serial.write("hello"); //رشته ای را ارساال کرده و تعداد بایت های رشته ارسال شده را در متغیر سمت چپ ریخته میشود.
}

 

serialEvent()

این تابع هنگامی که دیتایی به پورت سریال ارسال می‌شود فراخوانی می‌شود. تابع  serialEvent در آردوینو‌های Esplora, Leonardo, Micro پشتیبانی نمی‌شوند. از این تابع بعد از loop استفاده می‌شود.ساختار کلی این تابع به صورت زیر می‌باشد:

void serialEvent()
{
//عملیاتی که در هنگام دریافت دیتا قصد انجام آن را داریم
}

 

همچنین در آردیونوهای مگا به صورت زیر استفاده می‌شود :

void serialEvent()
{
//عملیاتی که در هنگام دریافت دیتا قصد انجام آن را داریم
}
void serialEvent1(){
//عملیاتی که در هنگام دریافت دیتا قصد انجام آن را داریم
}

void serialEvent2(){
//عملیاتی که در هنگام دریافت دیتا قصد انجام آن را داریم
}

void serialEvent3(){
//عملیاتی که در هنگام دریافت دیتا قصد انجام آن را داریم
}

 

مثال :

void setup()
{
  Serial.begin(9600);
}
void loop()
{
}
void serialEvent()
{
 if (Serial.available())
  {
   char ch=Serial.read();
    Serial.println(ch);
  }
}

 

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

 

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

 

درباره نویسنده

علیرضا قربانی

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

تبادل نظر و رفع عیب با ثبت دیدگاه

۱۵ دیدگاه

  • سلام
    خداقوت

    لطفا از پایه شروع به آموزش کنین
    مطالبی که تدریس میکنین خیلی پیش نیاز میخوان

  • سلام
    وقتتان بخیر
    میخواستم ببینم . به فرض مثال ما یک میکرویی داریم که هیچ اطلاعاتی ازش در دسترس نیست . فقط و فقط یک لاین ارتباطی ازش داریم . یعنی برای ارتباط و اینکه بشه سیگنالهاش رو آنالیز کرد . فقط و فقط یک لاین یا حد اکثر ۲ لاین داریم . مثل RX ,TXو یا K line و L line ای سی یو .و یا هر چیز دیگری . حالا چطوری میتونیم توسط اوردینو سیگنالهای دریافتی از این لاین رو ببینیم . و بتونیم پی به پروتکل داخلی ببریم و یا اینکه بشه فهمید سیگنالهایی که ارسال میکنه چیه ؟ . لطفا سریعتر پاسخ دهید به عنوان پروژه نیاز دارم .
    با تشکر

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

  • با سلام
    من میخوام با آردوینو از طریق ارتباط سریال یه کدی مثل این رو ارسال کنم :
    ۰۰۲۰۴۳۹۵۷۳۱۷|۱۵|۰۶۲۰۰۶۳۶۲۰۹۹۴۲۴|۰۶۱۰۴۵۷۷|۰|۰۰۰۰۰۰۰۰۱۰۰۰|۰۱|۰|۰۱|۰|۰|۰۰|۰۰
    ممنون میشم راهنمایی کنید، چون به هر روشی که کد رو ارسال میکنم سمت گیرنده دیتا رو به درستی دریافت نمیکنه، چرا که دیتای ارسالی به صورت تیکه تیکه و در چند قسمت مثلا ۴ قسمت ارسال میشه . ممنون میشم راهنمایی فرمایید …

    • با سلام
      ضمن تشکر از توجه شما، لطفا جهت بررسی دقیق‌تر، نمونه‌ای از دیتای دریافتی را ضمیمه کنید.

  • سلام اقای قربانی.بی زحمت یه مثال ساده از اردوینو وماژولsim800l می تونید بدارید.مثلا یه خروجی رله ای رو فعال کنه

  • سلام آقای مهندس.
    ممنون از وقتی که صرف می کنید. متأسفانه من هر کاری می کنم، نمی تونم از صفحه کلید و دستور void serialEvent()
    برای وقفه استفاده کنم. و برنامه تا آخر اجرا می شه و بعد می ره سراغ خوندن صفحه کلید. اگر زحمتی نیست، لطفاً راهنمایی کنید و بفرمایید اشکال کار کجاست؟!
    با سپاس زندیان پور

    • با سلام
      تابع event به اینصورت است که برنامه در loop در حال اجرا می‌باشد ، به محض آنکه دیتایی از پورت سریال دریافت شود ، برنامه به قسمت تابع serialEvent پرش می‌کند و کدهای داخل این تابع اجرا می‌شود.سپس دوباره برنامهبه همان جایی که پرش کرده است باز می‌گردد.