در این قسمت از آموزش قصد تکمیل کردن مبحث ارتباط سریال 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 می تونید بدارید.مثلا یه خروجی رله ای رو فعال کنه
با سلام
در این خصوص از آموزش زیر استفاده نمایید.
آموزش راه اندازی ماژول Sim800L بخش سوم کنترل وسایل برقی با SMS
سلام آقای مهندس.
ممنون از وقتی که صرف می کنید. متأسفانه من هر کاری می کنم، نمی تونم از صفحه کلید و دستور void serialEvent()
برای وقفه استفاده کنم. و برنامه تا آخر اجرا می شه و بعد می ره سراغ خوندن صفحه کلید. اگر زحمتی نیست، لطفاً راهنمایی کنید و بفرمایید اشکال کار کجاست؟!
با سپاس زندیان پور
با سلام
تابع event به اینصورت است که برنامه در loop در حال اجرا میباشد ، به محض آنکه دیتایی از پورت سریال دریافت شود ، برنامه به قسمت تابع serialEvent پرش میکند و کدهای داخل این تابع اجرا میشود.سپس دوباره برنامهبه همان جایی که پرش کرده است باز میگردد.
سلام این حرف درست نیست
serialevent در هر جای برنامه پرش نمیکنه بلکه اخر هر loop چک میکنه که ایا دیتایی از سریال دریافت شده یا نه
که اگه دریافت شده بود این تابع اجرا میشه
این هم منبع خود سایت اردوینو
https://docs.arduino.cc/built-in-examples/communication/SerialEvent/
با سلام
از همراهی شما سپاسگزاریم. البته موارد فنی را بایستی خود نویسنده اظهار نظر کنند.