به نام خدا
آموزش جامع آردوینو جلسه 6 : بازم سلام ، تو این مطلب آموزش آردینو ( آموزش آردوینو ) میخوام مبحث ارتباط سریال در آردینو رو انشاالله میخوام بقیه توابع رو بگیم(و مطلب رو تموم کنم)؛ پروژه آردوینو هم بمونه برا جلسه بعد.(البته پروژه برا توضیح کد ها رو گزاشتم؛ پروژه چیز منظورم بود
)
خب خب خب، بریم سراغ مطلبمون، تو این مطلب توابع رو کمتر توضیح دادم چون متاسفانه چیزی نداشت که بخوام بگم و مطلب رو الکی طولانی کنم و شما رو اذیت کنم؛ هر چند که این مطلب 1800 کلمه هستش( ) و بزرگترین مطلب این 5-6 جلسه هستش ولی به نسبت تعداد توابعی که توی این مطلب گفتم، حجم مطلب نسبت به مطالب قبل کمتره
…………بیکاری داری این چرت و پرت های منو میخونی ها….برو توابع زیر رو بخون برادر من برو….برو توبه کن….برو
از شوخی بگذریم اگه جاییش رو متوجه نشدید حتما سوال کنید.
1 |
Serial.readString(); |
جواب : همون طور که تو جلسه 4، تو توضیح تابع Serial.available گفتم ، این تابع اطلاعات رو در یه بافرری به نام بافر سریال(serial buffer) ذخیره میکنه.
یه مثال از این تابع
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
String my_data; void setup() { Serial.begin(9600); } void loop() { if (Serial.available() > 0) { my_data = Serial.readString(); Serial.print("Data is = "); Serial.println(my_data); } } |
1 |
Serial.readStringUntil(character); |
میتونید مثال زیر رو ببینید و تستش کنید تا عملکرد این تابع رو ببینید :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
String my_data; void setup() { Serial.begin(9600); } void loop() { if (Serial.available() > 0) { my_data = Serial.readStringUntil('z'); Serial.print("Data is = "); Serial.println(my_data); } } |
1 |
Serial.find(target); |
target : متن(رشته) ما که تابع Serial.find در به در دنبابلش هستش
تو مثال زیر تابع به دنبال کلمه "ali" هستش.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
bool find_my_data; void setup() { Serial.begin(9600); } void loop() { if (Serial.available() > 0) { find_my_data = Serial.find("ali"); Serial.print("find_my_data = "); Serial.println(find_my_data); } } |
1 |
Serial.findUntil(target, terminal); |
مثال زیر رو ببیند؛ در زیر هم توضیحش میدم تا بهتر متوجه بشید :
1 2 3 4 5 6 7 8 9 10 11 12 13 |
void setup() { Serial.begin(9600); } void loop() { if (Serial.available() > 0) { bool find_my_data = Serial.findUntil("ali", " "); Serial.print("find_my_data = "); Serial.println(find_my_data); } } |
یه مطلب خوب که این تابع رو توضیح داده : When do you use the Arduino’s Serial.flush
1 |
Serial.flush(); |
1 2 3 4 |
void serialEvent() { //وقتی اطلاعاتی برا دریافت موجود باشه این تابع اجرا میشه. } |
مثال زیر رو هم ببینید : تو این مثال طبق روان معمول اول sETUP اجرا میشه و بعد LOOP و وقتایی که دیتایی در دسترس باشه کد های داخل این تابع اجرا میشن.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
char my_data; void serialEvent() { my_data = Serial.read(); Serial.println(my_data); } void setup() { Serial.begin(9600); } void loop() { /*if (Serial.available() > 0) { my_data = Serial.read(); Serial.println(my_data); }*/ } |
البته پروژه بالا رو هم میتونیستیم به صورت زیر(مثل پروژه های جلسات قبل) بنویسیم.....بشینید و فک کنید که هر کدوم کجا ها ممکنه به کار بیاد.(برا این میگم تا تحلیل برنامه نویسیتون خوب بشه، البته عملکرد پروژه زیر و بالا هر دو یکسان هستش.)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
char my_data; /*void serialEvent() { my_data = Serial.read(); Serial.println(my_data); }*/ void setup() { Serial.begin(9600); } void loop() { if (Serial.available() > 0) { my_data = Serial.read(); Serial.println(my_data); } } |
1 2 3 |
Serial.write(val); Serial.write(string); Serial.write(buffer, length); |
val : یه عدد صحیح یا یه متغییر از نوع int....این عدد صحیح باس بین 0 تا 255 باشه که در واقع همون کد اسکی هستش.
string : رشته ای که قراره ارسال بشه.
length : طول, تعیین تعداد خونه های آرایه که قراره مقادرشون ارسال بشه.
buffer : آرایه ای(از نوع char) که قراره ارسال بشه.
مثلا زیر رو هم ببینید :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
char my_data[5]={'1','2','3','4','5'}; int x=61; void setup() { delay(3000); Serial.begin(9600); /*for (int i = 0; i < 255; i++) Serial.write(i); Serial.println(); */ Serial.write("DMF313.IR "); Serial.write(x); Serial.write(61); Serial.write(my_data,3); } void loop(){} |
و اگه اشتباه گفتم هم لطفا ذکر کنید.

1 |
Serial.peek(); |
در زیر یه مثال از این تابع گزاشتم براتون برا تفهمیم هر چه بهتر این تابع
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
char my_data1,my_data2,my_data3; void setup() { Serial.begin(9600); } void loop() { if (Serial.available() > 0) { char my_data1 = Serial.peek(); char my_data2 = Serial.read(); char my_data3 = Serial.read(); Serial.println(my_data1); Serial.println(my_data2); Serial.println(my_data3); } } |
تو این پروژه میخوام نشون بدم که وقتی از تابع peek استفاده میکنیم اطلاعات پاک نمیشن ولی وقتی از read استفاده میکنیم اطلاعات پاک میشن و در دفه ی دوم که میخوامی دوباره با تابع read اطلاعات رو بخونیم به مشکل بر میخوریم چون میقوع نمایش اطلاعات میبینیم که داره چرت و پرت نمایش میده(این بود هدف این پروژه ) >>> حواستون باشه که موقع اجرای پروژه فقط یه کاراکتر وارد کنید تا عملکرد پروژه رو ببینید.



Serial.readBytesUntil , Serial.readBytes , Serial.parseInt , Serial.parseFloat
تابع Serial.setTimeout به صورت زیر هستش:
1 |
Serial.setTimeout(time); |
که به جای time میزان تاخیر زمانی مورد نظرمون رو وارد میکنیم، مثلا در بالا حداقل به 2 ثانیه(برا هر رقم) نیاز داریم، لذا ما مثلا عدد 5 ثانیه رو وارد میکنیم(برا اطمینان) و حواستون باشه که time رو باید بر حسب میلی ثانیه بنویسید، یعنی به جای time باید بنویسید 5000.
توجه : حالت دیفالت(تو حالت عادی) مقدار این تابع 1 ثانیه هستش.(یعنی وقتی از این تابع استفاده نکنی) >> فاصله بین هر دو رقم ارسالی 1 ثانیه هستش
پروژه زیر رو هم ببینید....یه بار خط 7 رو بزارید باشه و یه بار حذفش کنید(به صورت توضیحات درش بیارید) و در هر دو حالت پروژه رو اجرا کنید تا عملکرد دو پروژه رو کاملا احساس میکنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
char my_data[20]; int number = 0; void setup() { Serial.begin(9600); Serial.setTimeout(5000); } void loop() { //if () if (Serial.available() > 0) { number = Serial.readBytes(my_data, 20); for (int i = 0; i <= number - 1; i++) Serial.print(my_data[i]); Serial.println(); } } |
خودمو کشتم تا به ساده ترین و بهترین روش توضیح بدم این تابع رو، امیدوارم قشنگ متوجه شده باشین این تابع رو.
parseFloat : این تابه هم مثل تابع بالا, فقط دنبال اعداد اعشاری هستش؛ البته اعدادی مثل 1و2و3 و.... رو به صورت 1.00 و 2.00 و3.00 و... میبینه.
1 2 |
parseInt(); parseFloat(); |
مثال زیر رو ببینید(بعد از اجرا مقدار مقابل رو وارد کنید "1mahde2ali3reza4mohammad5" )
1 2 3 4 5 6 7 8 9 10 11 12 13 |
int x; void setup() { Serial.begin(9600); } void loop() { if(Serial.available() > 0) { x = Serial.parseInt(); Serial.println(x); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
/* Serial Event example When new serial data arrives, this sketch adds it to a String. When a newline is received, the loop prints the string and clears it. A good test for this is to try it with a GPS receiver that sends out NMEA 0183 sentences. Created 9 May 2011 by Tom Igoe This example code is in the public domain. http://www.arduino.cc/en/Tutorial/SerialEvent */ String inputString = ""; // a string to hold incoming data boolean stringComplete = false; // whether the string is complete void setup() { // initialize serial: Serial.begin(9600); // reserve 200 bytes for the inputString: inputString.reserve(200); } void loop() { // print the string when a newline arrives: if (stringComplete) { Serial.println(inputString); // clear the string: inputString = ""; stringComplete = false; } } /* SerialEvent occurs whenever a new data comes in the hardware serial RX. This routine is run between each time loop() runs, so using delay inside loop can delay response. Multiple bytes of data may be available. */ void serialEvent() { while (Serial.available()) { // get the new byte: char inChar = (char)Serial.read(); // add it to the inputString: inputString += inChar; // if the incoming character is a newline, set a flag // so the main loop can do something about it: if (inChar == '\n') { stringComplete = true; } } } |
منبع این قسمت : SerialEvent
مردونه دوستان بیایم یه قولی بدیم؛ دیشب هم شب آخر قدر بود(که انشاالله ما رو هم دعا کردین)؛ این که هر چی یاد گرفتین(هر چقدر هم کوچولو) بیایم و به دیگران یاد بدیم و دریغ نکنیم؛ والا اگه با این کار دانسته هاتون کم بشه، یه به قول بعضیا به طرف چیزایی که بلدم رو یاد بدم بعدا طرف میشه رقیبم و از این چرندیاتی که بعضیا میگن؛ خداییش وقتی به طرف میای یاد میدی این اون نیست که یاد میگیره بلکه این تویی که یاد میگیری مشکلاتت رو و چیزایی که بلد نیستی رو……جدی میگم…این تجربه منه…..چون موقعی که میخوای یاد بدی به طرف چیزی رو…..میای و مثلا انواع حالاتی که ممکنه رخ بده، همه ی استثنا ها رو در نظر میگیری و اون وقت میای میبینی که ای بالا….این قسمتش رو که بلد نیستم یا اگه بلدم اشتباه بلدم و…. >>>>> در ضمن تو اسلام هم توصیه شده>>>>زکات علم و ملم >>>>فک کنم همتون شنیده باشین >>>> حالا از ما گفتن
خوب بابا بزرگ بازی بسه…..راستی نظرا فراموش نشه…..دعا برا ظهور حضرت و صلوات برا شادی روح شهدا و دعا برا سلامتی رهبر و علمای دین فراموش نشه(اینا هزینه این مطلب ناچیز هستش)
اگه جایی رو اشتباه گفتم لطفا بگید ، سوالی بود در خدمتیم
فعلا تا مطلب بعد یا علی
مهمان
سلام آقا مهدی
من یک سوال در مورد ارتباط سریال ad9850و آردینیو دارم چهار خط ارتباطی بین آردینیو و ماژول چه موقعه هایی سیگنال رد و بدل می کنند؟
مهمان
سلم بنده مثال serial.Event رو متوجه نشدم
مساله ی دیگر اینکه بنده از صفر دارم با آردوینو آشنا میشم و باید با اون برای مسایلی کار کنم این آموزش آیا جامع هست یا پیشنیازی برای آموزش های دیگره؟
ممنون میشم پاسخ بدید.
مهمان
ممنون عالی بود .تشکر
مهمان
سلام
برای ارسال دستورات AT
از چه تابعی استفاده کنم؟
یک سوال دیگه
وقتی برای سیم ۸۰۰ اس ام اس ارسال میکنیم متن اس ام اس کجا ذخیره میشود؟
ممنون میشم راهنمایی کنید
نویسنده این مطلب
سلام / print و printtln / خود sim800 فک کنم حافظه داخلی داشته باشه و به کمک همون at command ها بتونی بخونی.
مهمان
سلام
خوبین؟!
ببخشید یه سوال داشتم
خیلی واسم حیاتی… من یه سری دیتا از طریق sim800 ارسال میکنم به وب و در صورتیکه دیتا من رو دریافت کنه یه پیغام میفرسته سمت ماژول.
حالا میخواستم راهنمایی کنین از کدوم دستور و تابع استفاده کنم که بتونم این پیغام رو پیدا کنه و من بتونم ازش واسه موفقیت آمیز بودن ارسال که متوجه بشم فرستاده شده استفاده کنم؟!!!
ممنون میشم کمک ام کنی
مهمان
سلام
پس از پروگرم کردن یه برنامه در آردوینو که با پورت سریال کار میکرد و البته از پایه های مجازی استفاده نشده بود برای دریافت اطلاعات دیگه نمیشه رو بورد برنامه دیگه ای زد
ممنون میشم راهنمایی کنید
نویسنده این مطلب
سلام – نفهمیدم چی میگی – ولی اگه از پایه های 0 و 1 آردوینو uno که میشه همون پایه های uart میکرو که میشه پایه های پروگرام کردن میکرو! داری استفاده میکنی – خب میکرو پروگرام نمیشه – قبل از پروگرام کردن پایه های فوق رو جدا کن ( سیمی چیزی بهش وصل کردی) پروگرام کن، دوباره اتصالات مدارتو برقرار کن.
مهمان
سلام مجدد
فکر کنم سوالمو خوب طرح نکردم
برنامه زیر رو که کپی برنامه شما بود رو لود کردم تو آردوینو
void setup()
{
Serial.begin(9600);
}
void loop()
{
if (Serial.available() > 0)
{
my_data = Serial.readString();
Serial.print(“Data is = “);
Serial.println(my_data);
}
}
الان هر برنامه دیگه ای میخوام بزنم خطا میده و مینوسه
unable to uploading to board
نویسنده این مطلب
نمیدونم.
مهمان
سلام
تست زدم مشکلی نداره
یه دکمه رو برد هست با اون ریست کن برد رو مجددا کار کن
یه پیام هم به مهدی جون ==> تو این قسمت کامنت نوشتن این ایکون انتخاب ایموجی رو بزار سمت چپ – گذاشتی سمت راست میاد رو متن اذیت میکنه
مهمان
سلام ببخشید مزاحم شدم…
من یه مشکلی تو سریال با آردوینو دارم…
مشکل اینکه من یه دیتا رو از یه آردوینو میفرستم برا آردوینو دیگه ، آردوینو اونوری درست دیتا رو میگیره و دیتا رو پردازش میکنه و تو این مدت آردوینو اصلی منتظر جواب هست… مشکل اینجایه که دیتا ارسالی از آردوینو دیگه ارسال میشه ولی آردوینو اصلی که منتظره دیتا رو نمیتونه بگیره و دفعه دوم که تابع رو تکرار میکنم درست میشه حالا موندم واقعا الان این چه چیزی داره که دفعه اول رو نمیتونه دیتا رو دریافت کنه و وقتی هم که دوباره دیتا میفرسته بازم اینطوری میشه…
تا جایی که خوندم در موردش زمانی که دیتا رو میفرسته بافر رو تو یه حالت نگه میداره و نمیتونه دیتا دفعه اول دریافت کنه؟
مشکل برنامه کجاست؟ ممنون میشم راهنمایی کنید.
مهمان
سلام و خسته نباشید .
اقا مهدی من از دستور serial.readstring استفاده میکنم و اطلاعات یک جی پی اسو میریزم داخل یک متغیر از نوع استرینگ اما وقتی اون متغیررا پرینت میکنم چیزی چاپ نمیشه ولی وقتی ارتباط بین میکرو و جی پی اس قطع میکنم تازه حافظه بافر اون متغییر چاپ میکنه ممکنه راهنمایی بفرمایید
مهمان
سلام مهندس خیلی ممنون بابت توضیحات خوبی که می دی اجرت با امام حسین
فقط یه سوال
آقا چه زمانی تابعserialavailable داخلش اطلاعات میاد؟
نویسنده این مطلب
سلام.زمانی که دیتای دریافت میشه.
مهمان
سلام شرمنده مزاحم شدم
من عملکرد تابع write رو متوجه نمیشم اگر ممکن است سا ده تر بگید
همچنین ایا کار تابع serial.parseInt شبیه readاست با این تفاوت که فقط اینتیجر میگیره؟
نویسنده این مطلب
سلام
تابع Serial.write برای ارسال داده بکار میره که داخل کتابخونه آردوینو به 3 صورت که توضیح داده شد، تعریف شده –
1.شما میتونید یه متغییر از نوع کاراکتر بهش بدید تا یک کاراکتر رو ارسال کنه
2.میتونید یه متغییر از نوع String بدید تا همشو ارسال کنه.
3.میتونید یه آرایه کاراکتری بهش بدید و بگید که n خونه اول رو ارسال کن
تابع serial.parseInt هم کارش اینه که تو بافر مربوط به دیتا های دریافتی میره دنبال اعداد صحیح میگرده و بهمون میده – چیز کاربردی نیست به اون صورت.
مهمان
سلام جناب دمرچیلو
من می خواستم اعداد 0 تا 360 را از اردینو مگا به سیمولینک متلب ارسال کنم و در سیمولینک با بلوک serial reciveاعداد را دریافت کنم
دستورات serial.print و serial.writeرو امتحان کردم
فقط با دستور serial write اعداد بصورت صحیح در سیمولینک دیده می شود
ولی مشکل اینجاست که با این دستور محدوده اعداد ارسالی بین 0 تا 255 بوده و ارقام بعد از 255 را از صفر شروع می شود
خواهشمندم راهنمایی فرمایید چطور می تونم با دستور serial.write ارقام بیشتر از 255 رو ارسال نمایم
با تشکر
نویسنده این مطلب
سلام
مشکل شما اشتباه در فرمت ارسال و دریافت هستش
همونطور که میدونید هر کاراکتر ( 1 2 3 A a B b C c ! @ # و… ) دارای کد اسکی هستن ( سرچ کنی جدول کد اسکی رو میتونی ببینی ) و هر کاراکتر یه کد اسکی مخصوص به خودشو داره – مثلا کد اسکی کاراکتر 0 عدد 48 هستش ( تا جایی که یادمه ) – شما در قسمت ارسال و دریافت باید از توابع یکسان استفاده کنید – یعنی اگه کاراکتر میفرستید – کاراکتر بخونید – نه این که کاراکتر بفرستید و string و یا عدد بخونید.
مهمان
بسیار عالی-ممنون از اموزش های خوبتان.
مهمان
کارتون درسته خدا قوت
مهمان
سلام اقای دمرچیلوی عزیز ممنون از پاسخ سریعتون اما بعد : بنده میخوام رشته زیر رو که از کامپیوتر میاد رو توسط اردینو شناسایی کنم
۷E 45 46 03 04 B0 00 64 00 C8 05 DC 00 00 00 00 00 00 00 50 00 45 45 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 91 7E
این رشته ۶ بار از پورت سرال با سرعت ۴۸۰۰ وزمان ۵۰۰ms بین هر بار ارسال دیتای بین ۷E ها میتونه تغییر کنه در جواب این رشته اردینو
این رشته روبا همون ۴۸۰۰ مکرر ارسال کنه :
۷E EC FF 98 08
طوریکه بشه در این حال مقدلر ECFF رو بایه ولوم کم وزیاد کرد و مقدار ۹۸ ۰۸ رو هم بایه ولوم دیگه
در نهایت شرمنده شما هستم تا هر جا که راه داره برام توضیح بدید ممنون میشم
نویسنده این مطلب
متوجه منظورت نمیشم – خب این دیتا رو گرفتی – بعد میخوای چیکار کنی؟ خب مثلا اینا تو یه آرایه ذخیره میشه و شما دنبال ۴۵ هستید – خب یه if مینویسید که کل آرایه رو اسکن میکنه
مهمان
مهندس جان همین تیکه اول رو میتونی کدش رو برام بنویسی که رشته ورودی سریال داخل یه ارایه قرار بگیره حتما متوجه شدین رشته هگز که میاد ۶ بار تکرار میشه( جهت بالا بردن صحت اطمینان ارسال دیتا) اما دیتای مورد نیاز ما بین {۷E…7E} یکی از این رشته هاست .
بی نهایت از شکیباییتون سپاسگذارم
نویسنده این مطلب
خب چه کاریه – دیتا رو به صورت زمان بندی اگه میفرستی به میکرو – خب میکرو هر دیتایی طبق فرمت تعریف شده براش نبود رو ندید میگیره – چکاریه که ۶ بار میفرستید.
مهمان
سلام
ینی اردوینو با این عظمتش فکر وقفه نبوده؟و هیچ وقفه ای تو ارتباط سریال نداریم که مثه بچه ادم کار کنه؟!!!!!!!
مهمان
سلام و درود
ضمن تشکر از زحماتت سوالی داشتم.دستور serialEvent شبیه وقفه سریال در avr عمل می کنه؟
با تشکر
نویسنده این مطلب
سلام – داره – ولی من کار نکردم
مهمان
سلام آقا اونجوری که من فهمیدم با serial.print انگار میشه فقط کاراکتر فرستاد و با serial.write همونجری که خودتون گفتید یا string یا int یا کد اسکی ؟ درس میگم یا با serial.write هم میشه یک کارکتر فرستاد؟
نویسنده این مطلب
سلام – print برا ارسال یه سری کاراکتر هستش ( string ) و write برای ارسال یه تک کاراکتر هستش.
مهمان
آخه من الان با Serial.write همونطور که خودتونم فرستادید یه عبارت مثل “dmf” (رشته) فرستادم که می فرسته کارکترم میفرسته مثل ‘a’ البته الان یه سوال دیگه دارم الان من آردویینو مگا دارم و وقتی از Serial استفده می کنم هم تو monitor خود آردویینو هم با برنامه ی ترمینال سریالی که خودتون نوشتید خروجی رو می بینم ولی از Serial1 یا Serial2 یا ۳ استفده میکنم نه تو ترمینال آردویینو چیزی نشون میده نه نرم افرای دیگه
نویسنده این مطلب
چون فقط Serial با مبدل به کامپیوتر وصل شده – تو خروجی آردوینو هستش – برا ۳ تای دیگه باید از مبدل usb to ttl استفاده کنی که مطلبش تو سایت هستش
بسرچ : cp2012 اسمش باید این باشه
مهمان
سلام آقا مهدی الان تو آردویینو از serial.write برا نوشتن (فرستنده) و از توابع serial.read و امثالهم برا خوندن ( گیرنده)استفاده میشه
حالا اگه بخوایم از آردوینو بفرستیم و از میکرو بخونیم باید از putchar و getchar استفده کرد دیگه؟ مشکلی که آردوینو با putchar نداره؟
نویسنده این مطلب
سلام-منظورت اینه که بین آردوینو و AVR ارتباط برقرار کینی با کدویژن؟ درسته اسم توابع تو آردوینو و کدویژن ( یا اتمل استدیو و …) یکم فرق داره ولی کدهای داخل این توابع یکیه – لپ کلوم این که ظاهر این توابع فرق داره – باطنشون یکی هستش – مشکلی ایجاد نمیکنه – فقط شما وقتی CHAR میفرستی باید CHAR هم بگیری- یعنی وقتی از serial.write در سمت آردوینو استفاده میکنی که کارش ارسال یه تک کاراکتر هستش باید در سمت AVR هم از تابع getchar استفاده کنی که کارش دریافت یه کاراکتر هستش و…
مهمان
سلام
من از طریق سریال یه کدی رو مثلا ۱۲۳۴ دریافت کردم و توی یه متغیر String ریختم حالا میخوام این مقدار رو توی برنامه آخرش یه چیزی اضافه کنم مثلا # یعنی میخوام مقدار دریافتیم بشه #۱۲۳۴ چه جوری با چه دستوری میتونم این کار رو انجام بدم؟؟
برای یه دستور شرطی میخوام
میخوام تعریف کنم اگه کد دریافتی مقدار اصلی بود فلان کار رو انجام بده ولی اگه # بهش اضافه شده بود یه کار دیگه انجام بده
نویسنده این مطلب
سلام
اگه از STRING استفاده کردی – تو نت بزن – کتابخونه و توابع sTRING رو میراه برات… تابع مد نظر رو پیدا کن و استفاده کن.
مهمان
توی این سایت
https://goo.gl/MeBi8O
در موردش نوشته که با دستور Insert میشه رشته ای را در مکان خاصی از رشته دیگر اضافه کرد. به نظر همین به کارم بیاد ولی مشکلی که هست اینه که ننوشته چه جوری باید توی برنامه ازش استفاده کرد و کدش رو نوشت توی گوگل سرچ کردم اما چیز درستی نفهمیدم یه راهنمایی کوچیک بهم بکنی ممنون میشم
نویسنده این مطلب
اینی که تو پیدا کردی برا #C هستش و ما ++C میخوایم
مطلب زیر رو بخون
https://dmf313.ir/آموزش-جامع-آردوینو-جلسه-۱۹-string-در-arduino/
مهمان
آقا مهدی سلام
تابع من اینجوری شد peak با یه تقییر کوچیک تو مثال تابع
char my_data1, my_data2, my_data3, my_data4;
int i=0;
void setup()
{
Serial.begin(9600);
}
void loop()
{ if (Serial.available() > 0)
{
my_data1 = Serial.peek();
my_data2 = Serial.read();
my_data3 = Serial.read();
my_data4 = Serial.read();/////////////////////////////
Serial.print(i++);//////////////////////////
Serial.print(my_data1);
Serial.print(my_data2);
Serial.print(my_data3);
Serial.println(my_data4);///////////////////////////
}
}
را بفرستیم نتیجه این میشهasd وقتی که یه رشته مثل
0aaےے
1ssےے
2ddےے
حالا مشکل اینه که حلقه بار اول که اجرا میشه
serialread
دوم و سوم باز هم خانه اول بافر را میخونند تا اینکه دور دوم حلقه بافر اول پاک بشه و …
حالا با این تغییر
my_data1 = Serial.peek();
Serial.flush();
my_data2 = Serial.read();
my_data3 = Serial.read();
my_data4 = Serial.read();
نتیجه:
0aaےے
1ssdے
و این:
my_data1 = Serial.peek();
my_data2 = Serial.read();
my_data3 = Serial.read();
Serial.flush();
my_data4 = Serial.read();
نتیجه:
0aaےے
1ssےd
اینجوری که واقعا دردسره ، هر دفعه یه جور میشه ، این قضیه وقفه داخلی سریال خوشم نیومد اصلا !!!!
نویسنده این مطلب
کدت رو زیپ کن و لینکش رو بزار همینجا و دقیقا بگ کجاش مشکل داری.
مهمان
https://drive.google.com/open?id=0B_kXyLQgcHHmYVZpRHJfc1lhOFE
مشکل جای خاصی نیست ، یه برنامه تستی ه
میگم که با تغییر جای
Serial.flush();
در برنامه و اگه یه رشته سریال ارسال کنیم برنامه کاملا غیر قابل پیش بینی میشه!!
نویسنده این مطلب
شما دیتا رو میخونی – اگه دیتای مد نظرت بود یا نبود فلش میکنی.
مثلا فرمت دیتات ۱۰ بایتی هستش – ۱۰ بایت دیتا دریافت میکنی و بعد اگه اون چیزی که میخواستی بود یا نبود – بعد از بررسی دیتا – میای فلش میکنی
روال کار به این صورته.
مهمان
نفهمیدم الان دقیقا باید چی کار کنم ؟
نویسنده این مطلب
خب خودت گفتی دیگه – یه led سر مثبتش رو بزن به پایه دیتا و با یه مقاومت هم سری کن و ته مقاومت هم به زمین
میشه 2 تا led – یکی برا tx و یکی برا rx
مهمان
ای بابا همون سریال دیگه دو سه تا پست پایین رو دوباره بخونید
نویسنده این مطلب
آها – خب آره میتونی همون کاری که گفتی بکن – ولی خب یه مقاومت بالا بزار تا در ارتباط سریال مشکل ایجاد نکنه یه وقت – با خطا تست میتونی بهترین حالت رو پیدا کنی
مهمان
اقا مهدی جواب منو نمیدید؟
نویسنده این مطلب
کدوم سوال؟
مهمان
من توی ذهنم این.هست.که.ارتباط سریال یعنی همون تبادل صفر و یک و این صفر و یک ها در واقع همون روشن خاموش شدن های ال ای دی میتونه باشه درسته؟
ارتباط سریال من ارتباط اردوینو با ماژول rc522
مهمان
آقا مهدی چطوری میشه کاری کرد که وقتی اطلاعات داره از طریق سریال رد و بدل میشه یک ال ای دی بذارم و اون ال ای دی چشمک بزنه که کاربر بفهمه سیستم در حال انتقال اطلاعات هست؟
نویسنده این مطلب
خب به نظرم یکم درباره قرمت داده سریال تحقیق کن خودت متوجه میشی.
ولی خب بستگی به مدارت هم داره
الان ارتباط سریال – ارتباط میکرو با چی هستش؟
مهمان
سلام
عزیز درسته که ارتباط سریال ینی ۰ و۱ ها ولی باید اینم در نظر داشت کهچشم ما بیشتر از فرکانس ۵۰ رو نمیبینه جه برسه به فرکانس کیلو و مگا هرتز… وقتی شما از ال ای دی استفاده کنی ینی مستقیما به usart وصل کنی ال ای دی همیشه روشنه اما نه پر نور.
واسه کارت باید بعد هر رسته یه تاخیر زمانی بذاری بعد دستور روشن خاموش کردن ال ای دی رو بدی.
البته این چیزیه که من از سوالت فهمیدم
مهمان
سلام.
داداش این آردوینو مثل میکروکنترلر وقفه بافر دریافت نداره یعنی برناممون اجرا بشه وقتی دیتا دریافت شد سریع بره تو وقفه .
نویسنده این مطلب
سلام – داره.
مهمان
خب داداش کجاس. چجوری میشه استفاده کرد
نویسنده این مطلب
الان به مطلب اضافه میکنم – تا ساعت 3 فک کنم تموم بشه شاید هم زود تر.
نویسنده این مطلب
تموم شد
، قسمت serialEvent رو ببین.
مهمان
داداش دمت گرم ولی تو serialEvent کدای داخل حلقه loop اجرا میشن بعد که به اخر رسید میره تو تابع serialEvent .
وقفه ای نداره مثل کدویژن به محض اینکه دیتا اومد برنامه رو هرجا که هست ول کنه بره تو وقفه بعد بیاد به ادامه برنامه.
نویسنده این مطلب
طبق توضیحات بالای تابع serialEvent این حرفو زدی یا تست هم کردی؟
بزار یه تابه دیگه هستش دقیقا مخصوص این کار – پیدا میکنم و پیوست میکنم.
نویسنده این مطلب
کد زیر رو تست کن و نتیجه رو بگو – هر دیتایی که دریافت کنی میکرو همونو ارسال میکنه – تست کن و نتیجه رو بگو – باید جواب بده – تست کردی بگو تا پیوست کنم به سایت بقیه هم استفاده کننن.
void setup() {Serial.begin( 9600 );}
void loop() { }
ISR(USART0_RX_vect) {Serial.write( Serial.read() );}
مهمان
الان که دیدم منم این تابع رو تو یه سایت خارجی دیدم و ازش استفاده کردم اصلا کار نمیکنه و داخل تابع وقفه نمیره
نویسنده این مطلب
جهنم ظرر – بیا از وقفه خود Avr استفاده کن.
مهمان
متوجه نشدم. یعنی بیام از وقفه کدویژن اینجا استفاده کنم؟
نویسنده این مطلب
به جای وکتور قبلی USART_RXC رو قرار بده
مهمان
نمیشه.هر کار میکنم نمیره تو وقفه داداش خودت یبار تست کن ببین.راهی است برای این کار.
نویسنده این مطلب
پروژت رو زیپ کن بفرست ببینم چیه اصلا.
مهمان
سلام آقا دمت گرم . سایت ردیفی داری
من هم دنبال گرفتن سریع اطلاعات سریال هستم و مشکلم اینه که اول باید دستورات loop انجام شه بعد می ره تو تابع سریال. اگر راهی هست که هر جای از برنامه بود وقتی داده رو سریال بود برنامه پرش کنه رو تابع سریال
بعد سوال دوم من این بود که سریع ترین روش خودن داده از سریال برای آردینو چیه من با Serial.readStringUntil می خونم آیا روش های دیگه سریع تر هستند ؟ یا خیر؟
نویسنده این مطلب
سلام
باید از وقفه استفاده کنی.
مهمان
نه تست کردم
مهمان
عالی دمت گرم
مهمان
سلام مهدی جان آقا دستتدرد نکنه خسته هم نباشی. حقیقتش من میخوام چندتا سنسور رطوبت و دما رو از طریق پین SDA به اردونیو وصل کنم میشه راجع بهاون هم توضیح بدی؟
نویسنده این مطلب
سلام
خب نرم افزاری یا سخت افزاری آموزشش رو بدم؟
نرم افزاری رو هر دو پایه ای از میکرو میتونی استفاده کنی-سرعت کار کنتر
سخت افزار هم رو پایه های ۴-۵ آنالوگ فک کنم اتچ شده باشه پایه های sda و sca فک کنم اشماشون همینا بود
تا امشب سعی میکنم یه مطلب و یه پروژه نمونه بزارم(فک کنم ماژول با ارتباط ۲ سیمه داشته باشم)
ولی قول نمیدم….ولی از همین الان شروع میکنم به کارش تا شب یه مطلب دربارش بزارم تو سایت
مهمان
سلام
ممنون که جواب دادی
یه سری چیزا با خوندن مطالب مفید سایتت در مورد بیت فهمیدم ولی من فقط با دیدن مثال یاد میگیرم
ببخشید،میشه یه مثال کوچولو با دوتا pwm (یا حتی یکی)برام بزنی لطفا؟
نویسنده این مطلب
سلام
نه
خودت بنویس بده ببینم
و مشکل اگه داشت بهت بگم
مهمان
سلام اقا مهدی.واقعا خسته نباشی
من دارم رو سریال وpwm کار میکنم ولی یجا بدجور گیر کردم
من میخوام با سریال ۴ تا پایه pwm رو کنترل کنم ولی من فقط کنترل یدونشو بلدم
مثلا میخوام این کدو بفرستم تا بره تو متغیر یک:A1023 یا اینو بفرستم بره تو متغیر دو:B1023 و…
ولی نمیدونم چجوری اینکارو کنم
خواهش میکنم راهنماییم کن،خیلی واسم حیاتیه این موضوع
نویسنده این مطلب
سلام
یه روش که الان تو ذهنمه اینه…یه کد ۱۶ بیتی=۲ بایتی ارسال کن که ۸ بیت دیتای تو هستش و ۸ بیت تعیین این که تو کدوم متغییر باید ذخیره بشه
با این روش میتونی ۱۶ نوع مختلف دیتا ارسال کنی
ok?
مهمان
مرسی از مطالب کاملتون فقط من یک جا عبارت زیر را دیدم می خواستم توضیحشو هر چی زودتر بدید خیلی نیاز دارم
serial.write(0x0A(;
کلا میشه بگید اینها چی هستن ؟
(۰x1A)
(۰x0D)
(۰x0A)
نویسنده این مطلب
سلام
والا این روش مقدار دهی هستش….مثلا ۱۰-۲۰٫٫٫٫مثلا میگن فلانی نمره اش ۲۰ شد….این فرم عدد بر مبنای ۱۰ دهی هستش
حالا اعداد بر حسب باینری هم دارم….مثلا باینری عدد ۴ میشه ۱۰۰
این عدد ها و مقادیری که شما گزاشتی و با ۰x آغاز میشن به اینا میگن اعداد هگزا دسیمال….تو نت سرچ کنی یه آموزش خوب دربارش هستش…..سایت خیلی سبز فایلش رو درست کردم-pdf
مهمان
اقا یه چیزی یادم رفت
شما لایبرری های اینگلیسی رو می خونی متوجه می شی تابع هاشو یا توی نت سرچ می کنی فارسیش پیدا می شه توی خود سایت اصلی اردینو حتی کامل کامل نبود شایدم من خیلی وقت نزاشتم
یه چیز دیگرم اینکه به نزت چطوری یه برنامه اندروید بنویسم که بشه بلوتوث رو کنترل کنه شنیدم qt خوبه حالا نمی دونم از برنامه اپن سورس استفاده کنم مثلbt که متن بازه یا برم یه app براش یاد بگیرم بنویسم
نویسنده این مطلب
والا منبع فارسی درست و درمونی برا آردوینو نیست

همون اجنبی ها رو میخونم
والا خودمم هم تو فکرشم…..دارم C ایییم رو قوی میکنم هم برا دنیا و آخرتم خوبه و هم اگه قسمت شد یه سلامی هم بهQT بدیم ببینیم حالش چطوره…..
والا بستگی به خودت داره…..ببین چقدر نیازته….بسته به اون راهت رو انتخاب کن…..طوری نشه که یه بار تو عمرت تو یه کار خرکی بخوای از یه چیزی استفاده کنی و بری سراغ بهترین روش
و بیلعکس
مهمان
سلام اقا دمت گرم وقت میزاری
یه سوال توی کدویژن دیدی برای سریال اینتراپت جدا میزاری تا دیتا بیاد از برنامه اصلی می یاد بیرون میره انجام میده اینتراپت سریال روووووو
ولی این آردینو من تابع هاشو هم نگا کردم اینتراپت سخت افزاری بیشتز گفتن
یه دستوری قبلا گفتی serial.available بود ولی اونو می شه به عنوان اینتراپت نرم افزاری تعریف کرد؟؟؟؟
☻☺☻
به قول قدیمیا بعد علی تو مردی..
☺☻☺
راستی داش منم خیلی دوس دارم با سایتم باهات هم کاری الان در گیر پروژم ایشالا یه کم وقت آزادتر شد یه کارایی بکنبم
دوست داشتی اینهelek.ir
نویسنده این مطلب
سلام
…بگذریم
در ظاهر که میشه استقاده کرد
مردونگی به این کارا نیست
ما در خدمتیم
خیلی خیلی خوبه که سایت های الکترونیکی داره زیاد میشه
البته به شرطی که نرن تو کار CTRL+C و CTRL+V ……شما رو نمیگم….
یه سایتی چند وقت پیش دیدم….آشغال ترین مطلبم رو کپی کرده بود و ته سایتش تو قسمت FOOTER نوشته بود
مهمان
شاید باورتون نشه
ولی این صفحه ای ک باز شد من تمام لینک هاشو یک دور خونده بودم
مشکل من اینه ک تو پروژم هم تایمر دارم و هم nrt و این دو تا با هم کار نمیکنند
یعنی تایمر بدون اینتراپ کار نمیکنه و nrf با اینتراپ کار نمیکنه
کلا فکر کنم نوشتن برنامه با اینتراپ ی ذره متفاوته نه؟
نویسنده این مطلب
تایمر و اینتراپت رو سعی میکنم مطالبش رو بزارم تو سایت
مهمان
سلام دوست عزیز
خدا خیرت بده الهی
خیلی مطالب خوبی میذاری
من دارم ی پروژه کار میکنم با nrf و اردوینو
میخواستم ببینم شما میتونی تو این راه کمکم کنی؟
پروژه پایانی لیسانسمه
نویسنده این مطلب
سلام
….فقط کافیه بسرچی
کلیک کن
بچه های الکترونیکی خیلی سرچشون ضعیفه…..جدی میگم….تو نت همه چی هست….از شیر مرغ تا جون مرغ
امری بود در خدمتیم.