به نام خدا . در قسمت ۲ آموزش جامع ارتباط سریال آردوینو در خدمتتان هستیم . در قسمت اول به بررسی ماهیت پروتکل سریال و توابع print , println , begin , end , available پرداختیم. در این بخش نیز قصد داریم توابع خواندن از پورت سریال را مورد بررسی قرار دهیم.در ادامهی آموزش با سایت مرجع آردوینو، دیجی اسپارک همراه باشید.
read()
به وسیلهی این تابع دیتایی که بر روی پورت سریال قرار دارد خوانده میشود.این تابع اگر دیتایی دریافت نکند مقدار ۱- و اگر دیتایی دریافت کند ، همان دیتا را برمیگرداند. ساختار کلی تابع به صورت زیر میباشد:
Serial.read();
مثال:
void loop() { if (Serial.available()) { char ch = Serial.read(); if (ch >= '0' && ch <= '7') { int led = ch - '0'; bitSet(leds, led); updateShiftRegister(); Serial.print("Turned on LED "); Serial.println(led); } if (ch == 'x') { leds = 0; updateShiftRegister(); Serial.println("Cleared"); } } }
در مثال بالا به وسیلهی تابع available برنامه به گونهای نوشته شده است که فط در هنگام ارسال دیتا وارد پردازش شده و عملیات انجام میدهد و در صورتی که دیتایی بر روی پورت سریال دریافت نشود برنامه در عمل بدون پردازش میباشد.درصورتی که دیتایی دریافت شود تابه available مقدار true را برمیگرداند و برنامه وارد شرط شده و مابقی دیتاهایی که به درحال ارسال به سمت گیرنده هستند به وسیله تابع available در بافر گیرنده پورت سریال قرار میگیرند.سپس توسط قطعه کد زیر
char ch = Serial.read();
دیتای دریافتی درون متغیر ch ذخیره میشود و بعد از خوانده شدن توسط تابع read این دیتا از بافر گیرنده پورت سریال پاک میشود و در ادامه نیز این عملیات در صورت وجود دیتا در بافر سریال تکرار میشود.
Serial.readBytes()
به وسیلهی این تابع مقادیری از جنس بایت یا کاراکتر از روی بافر پورت سریال خوانده میشود و درون یک آرایه ( بافر ) دخیره میشود و تعداد بایت دریافتی را برمیگرداند. این تابع دارای ساختار زیر است:
Serial.readBytes(buffer, length);
lenght : تعداد بایتی است که قرار است دریافت شود.
buffer: نام آرایهای که قرار است اطلاعات خوانده شده از پورت سریال درون آن دخیره شود.این آرایه میتواند از جنس []char یا []byte باشد
این تابع هنگامی که به مقدار lenght دیتا دریافت کند عملیات خواندن از پورت سریال را متوقف میکند.
به مثال زیر توجه کنید :
char buffer[3]; int lenght; void setup() { Serial.begin(9600); } void loop() { if (Serial.available() > 0) { lenght = Serial.readBytes(buffer , 3); for (int i = 0 ; i <= lenght- 1 ; i++) { Serial.print(buffer[i]); } Serial.println(); } }
در این مثال برنامه به شروع خواندن پورت سریال میکندو هنگامی که ۳ بایت داده دریافت کرد متوقف شده و سه بایت دریافتی را چاپ میکند و دوباره به عملیات خود ادامه میدهد.
Serial.readBytesUntil()
دارای ساختار زیر میباشد :
Serial.readBytesUntil(character, buffer, length);
lenght : تعداد بایت مورد نظر برای دریافت
character : کاراکتری که به محض دیدن آن ، عملیات خواندن را متوقف میکند.
buffer : آرایهای از جنس []char یا []byte
این تابع عمل کردی مشابه تابع readBytes دارد با ایت تفاوت که دیتا را از بافر پورت سریال میخواند و به محض رسیدن به یک کاراکتر خاص ( character ) و یا تعداد تعیین شدهی بایت ( length ) عملیات خواندن را متوقف نموده و تعداد بایت دریافت شده قبل از کاراکتر مورد نظر را برمیگرداند ( اگر دیتایی موجود نباشد عدد ۰ را برمیگرداند ) .
به عنوان مثال در قطعه کد زیر برنامه شروع به خواندن از بافر پورت سریال میکند و هنگامی که به کاراکتر e رسید و یا هنگامی که تعداد بایت دریافتی به ۸ عدد رسید عملیات خواندن را متوقف میکند . و دیتای دریافتی را بر روی سریال مانیتور نرم افزار نمایش میدهد.
char buffer[8]; int lenght; void setup() { Serial.begin(9600); } void loop() { if (Serial.available() > 0) { lenght = Serial.readBytesUntil('e',buffer , 8); for (int i = 0 ; i <= lenght- 1 ; i++) { Serial.print(buffer[i]); } Serial.println(); } }
در قسمت بعدی آموزش به شرح توابعی دیگر از کتابخانه پورت سریال arduino خواهیم پرداخت . با دیجی اسپارک، مرجع تخصصی آموزش آردوینو به زبان فارسی همراه باشید.
تازه بخش اولش اینهمه بوووووود؟
من دلم میخواد زودتر همشو یاد بگیرم
ایشاالله به زودی یاد میگیرین
[…] آموزش ارتباط سریال در آردوینو بخش دوم […]
if (ch >= ‘0’ && ch <= ‘7’)
این > چیه اشباه ننوشی خود کامپایلرهم ارور میده هاااااا
سلام بنده اشتباه ننوشتم
افزونه های سایت تداخل پیدا کرده بودن و بعضی از کد ها اشتباه شده اند
(if (Serial.available() > 0
(++for (int i = 0 ; i < ; = lenght- 1 ; i
این gt& چه معنی میده؟
و for دومی هم لطفا توضیح بدین ؟
اینکه چرا چهارتا ; داره و اینکه i< یعنی چی؟
با تشکر از سایت عالی تون مهندس
با سلام
به علت مشکلی که در افزونه های سایت به وجود آمده بود کد ها با مشکل رو به روشده بودند.
اکنون کد ها اصلاح شدند و آماده استفاده می باشند.
بسیار عالی!
سپاسگزارم بابت زحماتی که میکشید و مطالبی که در سایت قرار میدید.
if (v==”salam”)
(sms.SendSMS(“09389817833″,”salam”));
سلام خسته نباشید
این تابع بالا ارسال پیام درsim 900(شیلد)میباشد که من برای پاسخ به پیام های دریافتی از این تابع استفاده کردم
من هروقت یه سلام میفرستم به شیلد “salam”جواب رو به من سلام میفرسته و این سلام من میره توی بافر سریال ذخیره میشه
چون توی حلقه lopهست برنامه هربار میاد روی این شرط جون سلام توی بافر سریال ذخیره شدا است هنوز یا پیام میده
که این ارسال پیام ها تا بینهایت ادامه داره
حالا سوال من اینه که چطور میتونم بعد این که پیام ارسال شد و جواب هم دریافت شد
بافر سریال خالی بشه که دیگه پشت سر هم پیام نفرسته ؟
چطور میتونم این کارو انجام بدم ؟
اگه امکانش هست به زبان ساده بم بگیت جون من مبتدی هستم.
با تشکر ازشما ???
با سلام
ضمن تشکر از توجه شما، این کتابخانه از تابع serial.read به منظور خواندن سریال استفاده میکند. این تابع پس از خواندن دیتا به صورت خودکار بافر را خالی میکند. این ارسال پشت سر هم به دلیل loop داخل برنامه هست. باید لوپ به گونه ای کنترل شود که پس از ارسال پیام، مجددا وارد این حلقه نشود و به بافر سریال هیچ ارتباطی ندارد.
باسلام و تشکر
در buffer[i] منظور از [i] چیست و این عبارت چه فرقی با متغیر buffer دارد؟
با سلام
متغیر i را به صورت دلخواه در کدها برای تابع for تعریف کرده ایم. اگر متن را دقیق مطالعه کنید متوجه خواهید شد.
سلام خسته نباشید من میخاستم خروجی پالس نبض رو تو مانیتور هم نمایش بدم امکانش هست کمکم کنید؟
برنامه من در حال حاضر تعداد پالس رو میتونم توی ال سی دی نمایش بدم
با سلام
منظور شما از مانیتور چیست ؟ کامل توضیح دهید.
سلام وقت بخیر
چطور میتونم اطلاعات شبکه can یه ماشین رو روی سریال مانیتور ide بخونم
لطفا کمکم کنید
با سلام
برای این منظور بایستی از مبدل Can به سریال استفاده کنید. سپس از یک برد آردوینو از جمله Uno استفاده کنید. سپس با اتصال به پایههای RX و TX برد آردوینو، و اجرای یک کد ساده میتوانید در سریال مانیتور دیتا را مشاهده کنید.
سلام باتشکر از اموزش خوبتون
ان کدgt& چی هست که تو اردوینو اررور میده ایا کتابخانه لازم داره
با تشکر
با سلام
کدها نیاز به بررسی داشتند، پیرو اطلاع رسانی شما اقدامات انجام شد.این علامت مربوط به علامت کوچک و بزرگ میباشد
بررسی و نتیجه را از همین طریق اطلاع رسانی کنید.
سلام ببخشید مشکل این قسمت چیه؟
char buffer[8];
int lenght;
void setup()
{
Serial.begin(9600);
}
void loop()
{
if (Serial.available() > 0)
{
lenght = Serial.readBytesUntil(‘e’,buffer , 8);
for (int i = 0 ; i <= lenght- 1 ; i++)
{
Serial.print(buffer[i]);
}
Serial.println();
}
}
با سلام
کاربر گرامی امکان بررسی کد متفرقه بدون توضیحات امکان پذیر نمیباشد.