Serial.readBytes : این تابع به صورت زیر هستش ، که مثل تابع Serial.read هستش کارش ، با این تفاوت که اطلاعات رو در آرایه buffer ذخیره میکنه و تعداد
بایت دریافتی رو هم میشه تعیین کرد.
|
Serial.readBytes(buffer, length); |
buffer : یه آرایه از نوع char یا byte که اطلاعات دریافتی درونش ذخیره میشه
length : یه متغیر از نوع int که کارش تعیین تعداد بایت مورد نظر که باس دریافت بشه و در آرایه ذخیره بشه.
توجه(مهم) : تو کد زیر اطلاعات دریافت شده در my_data و تعداد بایت دریافت شده در data ذخیره میشن.
|
data = Serial.readBytes(my_data, 3); |
مثال زیر رو ببینید تا عملکرد این تابع رو قشنگ قشنگ متوجه بشید 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
char my_data[3]; int number = 0; void setup() { Serial.begin(9600); } void loop() { if (Serial.available() > 0) { number = Serial.readBytes(my_data, 3); Serial.print("Data is = "); for (int i = 0; i <= number - 1; i++) Serial.print(my_data[i]); Serial.println(); } } |
خط 1 : تعریف یه آرایه که 3 خونه داره ، اطلاعات قراره تو این آرایه ذخیره بشن ( اگه نمیدونید آرایه چیه تو گوگل بسرچید "انواع متغیر و آرایه در c" ؛ فعالا حال توضیح دادنش رو ندارم ، جاش هم نیست بخوام این جا توضیحش بدم )
خط 6 : صد دفه تا حالا گفتم کار اینو 
خط 11 : اگه یادتون باشه(که بعید میدونم) تابع Serial.available کار این بود که اگه اطلاعاتی قابل دریافت باشه به ما اعلام میکرد و میتونست تا 64 بایت دیتا رو داخل خودش نگه داره و نزاره که از بین برن؛ حالا تو شرط if اومدیم گفتیم اگه اطلاعاتی قابل دریافت هستش (حداقل اطلاعات قابل دریافت 1 بایت باس باشه یا بزرگتر از 0 باشه ^_^) اون وقت بیا و کد های داخل if رو اجرا کن.
خط 13 : توسط این تابع 3 بایت دیتا دریافت میکنیم ، و اون متغیر number هم تعداد بایت دریافت شده توسط تابع Serial.readBytes هستش.(در "توجه" بالا گفتم که خروجی (چیزی که برمیگردونه) تابع Serial.readBytes تعداد بایت هایی که دریافت کرده هستش)
خط 17 و 18 : تو این دو خط اومدیم دیتا هایی رو که دریافت کردیم رو نشون میدیم ، البته میتونستیم به صورت زیر هم بنویسیم
فقط تنها مشکلی که پیش میومد این بود که تو دفعه اول دریافت و نمایش دیتا پروژه خوب کار میکنه(مثلا فک کنید دفه ی اول 3 بایت در my_data ذخیره میشه) ولی از دفه دوم به بعد(اگه تعداد بایت ذخیره شده در my_data مثلا بشه 2 تا) میاد و 2 بایت دریافت کرده(2 بایت جدید) رو نشون میده اما بایت 3 ام (که از دفعه ی اول مونه) رو هم نشون میده.
خط 20 : رفتنن به خط بعد.
>>>> 
توجه(مهم) : تو پروژه بالا از تابع Serial.available استفاده کردیم ، میتونیم پروژه ای بنویسیم که از تابع Serial.available استفاده نکنیم و آردوینو هم هنگ نکنه(نره تو حلقه بی نهایت ارسال دیتا)، اگه یادتون باشه گفتم که تابع Serial.readBytes تعداد بایت دریافت کرده رو نشون میده(بر میگردونه) و اگه چیزی دریافت نکنه "0" برمیگردونه ، حالا از همین خاصیت استفاده میکنیم به طوری که دیگه نیازی به استفاده از تابع Serial.available نباشه و برنامه هم هنگ(حلقه بینهایت ارسال دیتا) نکنه.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
char my_data[3]; int number = 0; void setup() { Serial.begin(9600); } void loop() { number = Serial.readBytes(my_data, 3); if (number > 0) { Serial.print("Data is = "); for (int i = 0; i <= number - 1; i++) Serial.print(my_data[i]); Serial.println(); } //else if(number==0)Serial.println("Hang!!!"); } |
تو این پروژه اومدیم و گفتیم اگه تعداد بایت دریافت شده(number) بزرگتر از صفر بود یعنی دیتا دریافت کردیم لذا نشون بده این دیتا ها رو و وقتی مقدار number برابر صفر بشه هم یعنی تابع دیتایی دریافت نکرده لذا برای این که حالت ببینهایت( هنگ کردن آردوینو ) رخ نده خط 22 پروژه بالا رو به صورت توضیحات درابردم.(میتونید این خط رو از حالت توضیحات دربیارید و ببینید که چطور آردوینو هنگ میکنه یا همون میره تو حالت ارسال بینهایت دیتا
....دیالوگ تکراری ، چند بار تا حالا این یه ذره جمله رو من تکرار کردم
)
مهمان
سلام داداش
من کل سایتتو گشتم ولی چیزی ک میخواستمو پیدا نکردم
من میخوام بصورت مثال میگم داخل سریال مانیتور برنامه اردوینو مثلا بنویسم on و یه پین اردوینو ۱ بشه و وقتی off رو ارسال کردم ۰ بشه میدونم کد پیچیده ای نیست ولی خب ممنون میشم توضیحش بدی برام
مهمان
ممنون از زحماتتون ، با آرزوی موفقیت برای همه مون
مهمان
با سلام
میبخشید که چنین سوالی رو اینجا مطرح میکنم
در کد نویسی برای سروو موتور ۳۶۰ ، با تکمیل هر قسمت سروو موتور یک مرحله به جلو حرکت میکند ،آیا دستوری داریم که وقتی در آردوینو شمارشگر به یک عدد معینی رسید مثلا عدد ۸۰ ، سروو موتور به عقب برگردد و در حالت صفر ساکن شود؟
قبلا از زحمات شما مهندس گران قدر کمال تشکر را دارم
مهمان
سلام
مهندس من منتظر جواب شما هستم.
نویسنده این مطلب
سلام – خب سرو موتور یه موتور که بر مبنای تغییرات ولتاژ میچرخه – معمولا در مدل های مختلف/زاویه های چرخش مختلف تولید میشه، مثلا 180 درجه؛ خب ولتاژ 0 تا 5 رو تغییراتش میشه 0 تا 180 درجه – این از تئوری داستان.
خب حالا سوال شما : با کتابخونه های مد نظر شما من روشون مسلط نیستم، معمولا سعی میکنم خودم کتابخونه برا خودم بنویسم! اما با روال کار که گفتم خودتون به راحتی میتویند توابع مورد نیازتون رو بنویسید، دیتاشیت موتور هم که هستش.
مهمان
datapacket[0]==0xA2;
datapacket[10]==0xB2;
datapacket[1]= synctime & 0xFF;
datapacket[2]= (synctime >> 8) & 0xFF;
datapacket[3]= (synctime >> 16) & 0xFF;
datapacket[4]=(synctime >> 24) & 0xFF;
datapacket[5]= x & 0xFF;
datapacket[6]= (x >> 8) & 0xFF;
datapacket[7]=y;
checksum=datapacket[0]+datapacket[1]+datapacket[2]+datapacket[3]+datapacket[4]+datapacket[5]+datapacket[6]+datapacket[7]+datapacket[10];
datapacket[8]= checksum & 0xFF;
datapacket[9]= (checksum >> 8) & 0xFF;
Serial.write(datapacket,11);
سلام خواستم بگم که من 11 بایت می فرستم ولی 8 تا رو میخونه اونور چی کار کنم که 11 تاش برسه؟؟؟؟
نویسنده این مطلب
سلام – چطور میخونی اونوقت؟ کد ارسال که به نظر میاد مشکلی نداره.
مهمان
سلام؛ خیلی ممنون که پاسخ دادید؛ بله ارسالش درسته ولی با serial1.read bytesمی خونم و فقط ۸ بایت بهم برمیگردونه در حالیکه باید ۱۱ بایت باشه و baud rate هم 1000000 هست و از mega r3 2560 استفاده می کنم در دو طرف
نویسنده این مطلب
از تابع read استفاده کن – بنداز داخل While هرچی خوند رو نشون بده – بعد برو بررسی کن ببین دیتا ها به درستی دریافت شدن یا نه – اگه درست دریافت شدن که همینطور – بحث timeout تابع فوق رو باید بررسی کنی یا این که یه تابعی بنویسی و توش از Read استفاده کنی.
مهمان
از whileاستفاده کردم نشد، باز هم هشت تا دریافت میشه؛ انگار که جلوش بسته است، در صورتی که تا 63 بایت جا داره برای ارسال و دریافت،تایم اوت رو چطور بررسی کنم وقتی دقت میکروثانیه است، اصلا تایم اوت رو نفهمیدم؛ و منظورتون از تابع نوشتن serial.event رو میگید؟
نویسنده این مطلب
احتمال میدم موقع نمایش اطلاعات تو پنجره سریال از فرمت نمایش درستی استفاده نکردی و بعضی کاکرکتر ها که قابل نمایش نیستن رو فک میکنی دریافت نکردی – در حالت آخر خاسی حظوری بیار ببینم مشکل از کجاس – شهرقدس ( البته اگه خونتون اینجاس )
مهمان
ممنون، فهمیدم مشکل از کجاست، باید از دو درگاه سریال جدا استفاده می کردم.
نویسنده این مطلب
یه چیزی – هر موقع خاسی سوال بکنی – کامل توضیح بده به طرف – تا الان من فک میکردم دو تا میکرو داری – یکی دیتا میده یکی دیگه میگیره!
مهمان
بله درست فکر کردید فقط گفتم پورت سریال بیشتری استفاده کردم
مهمان
سلام مهندس
شما از چهIDE استفاده می کنید که زمینه اش سیاه خطوطش شماره دار و کلماتش رنکی است
خیلی محیط جالبی است
ممنون میشوم راهنمایی فرمایید
نویسنده این مطلب
سلام – این مربوطه به سایت و نه IDE
مهمان
سلام ممنون بابت آموزش خوبتون
من یه مشکل تو ارتباط سریال آردینو با atmega8 کردم.
آردینو مگا با آردینو uno به راحتی ارتباط برقرار میکنه ولی با atmega8 نه
کریستال و باودریت ها یکسانه
لطفا راهنمایی کنید
نویسنده این مطلب
سلام – ببین کجا سوتی دادی – اتصالات – برابر نبودن تنظیمات در دو طرف و…
مهمان
سلام.
من این مثالی که زه بودین رو عملی بستم.
#include
LiquidCrystal lcd(8,9,10,11,12,13);
char my_data;
void setup()
{
Serial.begin(9600);
lcd.begin(16,2);
}
void loop()
{
lcd.setCursor(0,0); lcd.print(“my_data=”);
if (Serial.available() > 0)
{
my_data =Serial.read();
Serial.print(“DATA IS = “);
Serial.println(my_data);
lcd.setCursor(0,1); lcd.print(my_data);
}
}
بعد میخام دیتا دریافتی رو روی lcd هم نمایش بدم ولی وقتی دیتا میفرستم lcd قاطی میکنه 0علامت ؟ نشون میده.
نویسنده این مطلب
سلام
کد زیر رو بزار داخل Setup
lcd.setCursor(0,0); lcd.print(“my_data=”);
lcd.write رو هم تست کن.
مقدار اولیه متغییرت رو ‘0’ قرار بده.
تو خط زیر، نمیدونم دیتا با چه فرمتی به سمت میکرو ارسال میکنی ولی اگه تمام کار ها رو کردی و جواب نداد بیا یه ‘0’ به مقدار خونده شده از پنجره سریال اضافه کن و بعد بده به متغیرت
my_data =Serial.read();
مهمان
کمک لطفا
http://www.eca.ir/forums/thread73502.html
مهمان
با سلام
آقا مهدی واسه سایت خوبتون ازت تشکر میکنم.ی مشکل برام پیش اومده دوس داشتم مطرح کنم اگه کسی اطلاع داره کمکم کنه.به وسیله ماژول بلوتوث hc05 به آردوینو ارتباطش برقرار کردم حالا میخوام بوسیله گوشی براش ی کد بفرستم و مثلا ی LED روشن کنه که در اینجا مشکلی پیش نمیاد و درست عمل میکنه.
جایی که مشکل دارم اینجاست که میگم حالا ی کد دیگه براش بفرستم که اگه فلان LED روشن باشه ی کد از آردوینو به سمت گوشی بفرسته که متاسفانه فرستاده نمیشه میخواستم بدونم مشکل کجاست؟؟
البته متوجه شدم که اگر دو تا if در هم باشه این مشکل پیش میاد اگه یکی باشه مشکل نداره
ممنون میشم کمک کنید
برنامه نویسیش :
نویسنده این مطلب
سلام
احتمالا اگه مدار در عمل درست باشه مشکل از ریجستر ها میتونه باشه – که فقط مثلا گیرنده بودن رو فعال کردی و فرستنده رو نه – ریجستر های ارتباط سریال
مهمان
با سلام. مهندس ممنون از آموزشهای خوبتون. یه سوال داشتم. من کد ارتباط سریال رو نوشتم و برد من آردینو مگا2560 هست. دیتا رو به کامپیوتر با مبدل USB به Serial می فرستم. دیتای ارسالی از برد به درستی در ترمینال ویندوز (نرم افزار RealTerm) دیده می شه اما نمیتونم از کامپیوتر دیتا به برد بفرستم. مشکل از چیه؟
نویسنده این مطلب
سلام
تا جایی که یادمه نیاز به برد تبدیل نیست چون خود آردوینو رو که با usb وصل میکنی کافیه
تو ترمینال خود آردوینو تست کنید و بعد برید سراغ ترمینال های دیگه
مهمان
سلام خداقوت
عالی بود
مهمان
عالی بود، جای قلی خالی بود.
مهمان
سلام داش مهدی!
دمت گرم ! خداقوت!
امشب جلسه پنجم رو خوندم!
حاجی یدونه ای! (دوتا بودی هیئت میزدیم خدایی)
ولی خدایی من این همه سریال نمیره تو کلم! D-:
نویسنده این مطلب
سلام

والا وا سیبیل رو هم بازور داریم چه برسه به ریش
تیپمون هم که دیگه
ولی به زودی کبلایی میشم انشاالله
والا اینجا دانشگاه و مدرسه نیست که بخوای همه چیز رو حفظ کنی…..هر موقع لازمت شد یه سر به مطلب بزن و ببین کدوم تابع بدردت میخوره و ازش استفاده کن…..کاری که من میکنم
مهمان
سلام آقا دمرچیلو.
واقعاااا بابت مطالب مفید و وقت با ارزشی که میذارین ممنون.
من همه مباحث آردوینو رو سیو کردم عالی بودن برای یه پروژه قصد دارم ازش استفاده کنم و اگر به مشکلی برخوردم مزاحمتون میشم.
بازم ممنون.
خدا قوت
مهمان
اقا ممنون عالی بود
نویسنده این مطلب
مهمان
سلام محتوای سایت بسیار عالی است واز وقتی که میگذاری تشکر میکنم.
از اىنجا به بعدش رو خواستی سانسورش کن
چند جا دیدم نوشتی ” دو هزاریتون افتاد” راستش مثل هر ضرب المثل واصطلاحات رایج اینم برأی خودش داستانی داره واونم اینه که اون قدیما تلفن های عمومی بجای کارت با سکه پول کار میکردن یعنی گوشی رو برمیداشتیم یه دو ریالی تو قلکش می انداختیم تا صدای بوق آزاد می آمد و میتونستی شماره تو بگیری وقتی طرف مقابل گوشی رو بر می داشت دو ریالی به داخل قلک می افتاد وارتباط برقرار می شد اگه بوق اشغال می آمد قلاب گوشی رو فشار میدادی و سکه رو پس میگرفتی. گاهی أوقات بدلیل میکانیکی بودن سیستم سکه گیر میکرد و نمی افتاد تا ارتباط برقرار بشه یا در صورت اشغال بتونی سکه رو پس بگیری!البته بیشتر وقت ها یه مشت محکم کار ساز بود.پس افتادن سکه نشانه برقراری ارتباط بود .بچه تهرونی ها با لهجه خودشون به دو ریالی میگن دوزاری؟!!ما ما میگفتیم دو قِرانی!؟ و این اصطلاح رایج شد که آیا طرف مطلب رو گرفته پس معلومه دوزاریش افتاده.امیدوارم دوزاری شما هم افتاده باشه و بدونی از هر رده سنی و از هر کجای ایران بازدید کننده دارید.موفق باشید
نویسنده این مطلب
سلام


دمت گرم داش….نمیدونستم
راستی نمیدونستم بچه تهرونی ها لحجه دارن…..
مهمان
ببخشید یک سوال داشتم می خواستم بدونم تو آردوینو به چه صورت می شه فایل hex را به دست آورد.مرسی از سایت خوبتون
نویسنده این مطلب
سلام
مطلب زیر رو ببین…داشمون توش توضیح داده
http://wle.ir/6997/%D8%B4%D8%A8%DB%8C%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-%D8%A2%D8%B1%D8%AF%D9%88%DB%8C%D9%86%D9%88-%D8%A8%D8%A7-%D9%BE%D8%B1%D9%88%D8%AA%D8%A6%D9%88%D8%B3.html
سوالی بود در خدمتیم