ارتباط سریال نرم افزاری در آردوینو – آموزش آردوینو جلسه پنجم
ارتباط سریال نرم افزاری در آردوینو رو جلسه پیش که موضوعش ارتباط سریال در آردوینو بود توضیح مختصر دادم ،گفتم میشه بجز پایه های صفر و یک که پایه های سریال هستند از پایه های دیگه هم با کتابخونه ی SoftwareSerial.h بعنوان سریال تعریف کنیم و ازش استفاده کنیم؟ به خاطر اینکه پایه ها واقعا حالت سریال ندارن و ما به شکل ارتباط سریال نرم افزاری داریم اونارو تبدیل به سریال میکنیم به این نوع ارتباط سریال میگن ارتباط سریال نرم افزاری .
در برد های سری mega فقط پایه های :
10, 11, 12, 13, 14, 15, 50, 51, 52, 53, A8, A9, A10, A11, A12, A13, A14, A15
توانایی استفاده شدن بعنوان RX رو دارن.
و توی برد Leonardo فقط پایه های زیر میتونن بعنوان RX تعریف بشن:
8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI)
برای اینکار از تابع زیر استفاده میکنیم.
تابع SoftwareSerial(rxPin,txPin) :
1 2 3 4 |
#define rxPin 2 #define rxPin 3 // set up a new serial port Softwareserial mySerial = SoftwareSerial(rxPin,txPin); |
که پایه ی
rxPin معادل پایه ی RXD یا گیرنده هست و
txPin معادل TXD یا فرستنده.
البته میشه اون define ها رو هم ننوشت ، اما اینا قرار دادهایی نانوشته هستند بین برنامه نویس های آردوینو توی همه ی جهان که سعی میکنن شبیه به سایت اصلی آردوینو کد بزنن ، اینطوری کدهاتون رو میتونین خیلی راحت تر با بقیه ی مردم جهان به اشتراک بزارین و هرکسی که کدتون رو دید خیلی راحت تر و سریع تر مفهوم کدتون رو بفهمه و حتی بخودتون کمک میکنه، مثلا اگه جایی از کدتون مشکلی داشت بخاطر نظم توی نوشتارتون باگ رو پیدا کنید و رفعشون کنید.
توی پورت سریال نرم افزاری چند تا تابع اضافه بر تابع های قبلی هم وجود داره که بهتون میگم :
توابع ارتباط سریال نرم افزاری در آردوینو
تابع mySerial.begin
این تابع سرعت ارتباط سریال نرم افزاری رو برحسب بیت بر ثانیه تایین میکنه که سرعت های تعریف شده این ها هستن:
300,1200,2400,4800,9600,14400,19200,28800,31250,38400,5760,115200
اگه مطلب براتون گنگ بوده سعی کنین این مثالو بفهمین همه چی حل میشه:
مثال:پورت سریال نرم افزاری با سرعت 9600 بیت بر ثانیه در پایه های 3 و 4 رو تعریف کنید.(اول خوتون سعی کنید و بنویسید ، بعد جواب رو نگاه کنید. تا کدنویسی رو خودتون شروع نکنید با تنها خوندن کدها ، هیچوقت برنامه نویس نمیشین!)
سعی میکنم بیشتر هم از مثال های خوده سایت آردوینو استفاده کنم.
1 2 3 4 5 6 7 8 9 10 11 12 |
#include <SoftwareSerial.h> #define rxPin 3 # define txPin 4 softwareSerial mySerial =SoftwareSerial(rxPin,txPin); void setup() { pinMode(rxPin,INPUT); pinMode(txPin,OUTPUT); mySerial.begin(9600) } void loop(){ //… } |
این کد بالا کاری نمیکنه جز اینکه پایه های 3 و4 رو برای ارتباط سریال کانفیگ میکنه.
نکته مهم دیگه هم اینکه، mySerial اسم ارتباطیه که ایجاد کردین و اگر 2 تا ارتباط سریال همزمان میخواین ایجاد کنید باید برای ارتباط دوم هم یک اسم اختصاص بدین.این اسم ها هر چیزی میتونن باشن ، مثل نامگذاری متغیر ها .
تابع SoftwareSerialName.available
که بجای SoftwareSerialName ، اسمی که برای سریال انتخاب کردیم قرار میگیره.
و روش کار تابع available به این شکله که تعداد بایت های موجود برای دریافت رو نشون میده و برمیگردونه.
تابع SoftwareSerialName.read
این تابع هم برای خوندن اطلاعات به کار میره.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <SoftwareSerial.h> #define rxPin3 #define txPin 4 char Data; SoftwareSerial mySerial = SoftwareSerial(rxPin, txPin); void setup() { pinMode(rxPin, INPUT); pinMode(txPin, OUTPUT); mySerial.begin(9600); } void loop() { if (mySerial.available() > 0) { Data = mySerial.read(); }} |
تو این برنامه ،در حلقه ی loop اون if رو قرار میدیم و شرط میکنیم که اگر ورودی سریال اصطلاحا available بود و دیتایی دریافت میشد تابع read کار خودش رو شروع کنه و اون دیتا رو بخونه.
تابع SoftwareSerialName.print(data)
تابع بالا هم معرف حضور هستن و برای نمایش دیتا روی پرت سریال به کار میرن.
تابع SoftwareSerialName.println
این تابع هم که تفاوتی با print نداره جز اینکه بعد نمایش دیتایی که میخوایم یک کاراکتر رفتن به خط بعد ارسال میکنه و نشانگر رو میبره روی خط بعد.
تابع SoftwareSerialName.write
این تابع هم برای ارسال دیتا به پورت سریال نرم افزاریِ ایجاد شده کاربرد داره.
1 2 3 4 5 6 7 8 9 10 11 12 |
SoftwareSerial mySerial(10, 11); void setup() { mySerial.begin(9600); } void loop() { int bytesSent = mySerial.write(“hey!”); //send the string “hey!” and return the length of the string. mySerial.write(28); // send a byte with the value 45 } |
تابع listen
این تابع پورت سریال نرم افزاری ایجاد شده رو فعال میکنه. توی هر لحظه فقط میشه یک پورت سریال نرم افزاری رو فعال کرد.
تابع isListening
این تابع تست میکنه که آیا پورت نرم افزاری فعال شده و میشه با اون تبادل داده کرد یا نه.
خروجی این تابع یک متغیر صحیح یا غیر صحیح هستش (متغیر بولی)
تابع overflow
این تابع سرریز شدن بافر ورودی رو بررسی میکنه و متغیر خروجی اون هم متغیر بولی هست.
تابع peek
این تابع داده ی دریافت شده در پایه ی rxPin رو میده ، برخلاف تابع read ، اگر این تابع رو چند بار فراخوانی کنیم ، متغیر یکسانی میده.
بازم مثال:
دو پورت سریال نرم افزاری تعریف کنید و متنی را از طریق آن ها ارسال کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#include <SoftwareSerial.h> SoftwareSerial portOne(2, 3); SoftwareSerial portTwo(4, 5); void setup() { Serial.begin(9600); portOne.begin(9600); portTwo.begin(9600); } void loop() { portOne.listen(); portTwo.listen(); if(portOne.isListening()){ Serial.println("port One is listening!"); }else{ Serial.println("port One is not listening!"); } if(portTwo.isListening()){ Serial.println("port Two is listening!"); }else{ Serial.println("port TWO is not listening!"); }} |
سلام و وقت بخیر
چرا در مثال آخر portTwo.listen(); نوشته نشده ؟؟؟
نیاز نیست یا جاافتاده ؟؟؟
اگر جاافتاده باید کجا اضافه بشه ؟؟؟
ممنون از سایت عالی تون
سلا مرسی دوست عزیز
درست میگین جا افتاده ، اصلاح شد کد.
🌺
سلام وقتتون بخیر
1. ببخشید چطوری میشه فایل هگز درست کرد که بتونیم از اونا برای شبیه سازی استفاده کنیم؟
2. بعد سایز فونت برنامه نویسی رو نمیشه تغییر داد آیا؟
ممنون بابت راهنمایی هاتون
سلام مجدد 😀
1- با کلید های ctrl+alt+s جایی که کدتون رو سیو کردین خروجی hex هم سیو میشه
2-چرا میشه . از منوی file گزینه ی preference بخش edit font size میتونین مقدارش رو تغییر بدین
موفق باشین