 |
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
|
|
نشاط [ F.Abdelaziz ]
قوة السمعة:333
|
|
03-04-2020, 06:29 PM
المشاركة 1
|
|
دورة برمجة الاردوينو : الدرس التاسع عشر
الحصول على واستخدام الإدخال التسلسلى والاردوينو Getting and Using Arduino Serial Input
يوضح هذا الدرس كيفية الحصول على البيانات في برنامج الاردوينو من المنفذ التسلسلي serial port. يمكن إرسال البيانات إلى الاردوينو من نافذة المراقبة التسلسلية فى في Arduino IDE.
يمكن للمستخدم إدخال البيانات في حقل الإدخال في نافذة المراقبة التسلسلية لإرسال القيم والبيانات إلى Arduino. يمكن استخدام أي برنامج تسلسلي ، أو حتى تطبيق تسلسلي مخصص لإرسال البيانات إلى Arduino بدلاً من استخدام نافذة المراقبة التسلسلية.
تم استخدام نافذة المراقبة التسلسلية فقط لأغراض الإخراج. تم استخدامها لعرض النتائج أو المخرجات من برامج الأمثلة المختلفة في كل درس . دعونا الآن نلقي نظرة على كيفية التعامل مع كل من المدخلات والمخرجات التسلسلية.
الحصول على الإدخال التسلسلي Getting Serial Input
يوضح البرنامج التالي كيفية الحصول على حرف واحد من نافذة المراقبة التسلسلية Serial Monitor وتحديد ما إذا كان الحرف رقمًا أم لا.
كود:
void setup() {
Serial.begin(9600);
}
char rx_byte = 0;
void loop() {
if (Serial.available() > 0) { // is a character available?
rx_byte = Serial.read(); // get the character
// check if a number was received
if ((rx_byte >= '0') && (rx_byte <= '9')) {
Serial.print("Number received: ");
Serial.println(rx_byte);
}
else {
Serial.println("Not a number.");
}
} // end: if (Serial.available() > 0)
}
كيف يعمل البرنامج How the Sketch Works
1- التحقق من وجود حرف Checking for a Character
في الدالة الرئيسية loop() ، يتم استخدام عبارة if للتحقق مما إذا كان الحرف متاحًا على المنفذ التسلسلي - أي إذا تم إرسال حرف من نافذة Serial Monitor واستقبله Arduino.
يتم تشغيل عبارة if هذه بسرعة لتشغيل العبارة if والعودة إلى أعلى الحلقة لتشغيلها مرة أخرى.
كود:
if (Serial.available() > 0) { // is a character available?
}
لا يتم تشغيل أي شيء في جسم عبارة if حتى يتم استقبال حرف.
2- الحصول على حرف Getting a Character
عند استقبال حرف على المنفذ التسلسلي ، يتم تخزينه في متغير حرف (من نوع char) يسمى rx_byte.
كود:
rx_byte = Serial.read(); // get the character
يتم الآن تخزين نسخة من الحرف المستقبل في المتغير rx_byte ويمكننا استخدام الحرف المستقبل في برنامجنا .
3- التحقق مما إذا كان الحرف المستقبل رقمًا Check if the Received Character is a Number
يختبر البرنامج ما إذا كان الحرف المستقبل رقمًا أم لا عن طريق التحقق مما إذا كان الحرف أكبر من أو يساوي "0" وأقل من أو يساوي "9".
كود:
if ((rx_byte >= '0') && (rx_byte <= '9')) {
}
نحن نتحقق فعليًا من "أحرف الأرقام" من '0' إلى '9' وليس الأرقام الصحيحة الفعلية من 0 إلى 9. وذلك لأن البيانات التي يتم استقبالها من نافذة Serial Monitor تكون بتنسيق ASCII.
من الجدول الذي يظهر أحرف ASCII القابلة للطباعة ، يمكننا أن نرى أن حرف '0' له القيمة الصحيحة 48 عشري وأن حرف '9' له قيمة 57 عشرى . وبعبارة أخرى عند كتابة '0' على لوحة المفاتيح في حقل "إرسال" "send" من نافذة Serial Monitor ويتم النقر فوق الزر إرسال Send ، يتم إرسال القيمة الصحيحة 48 إلى Arduino. في البرنامج ، يمكننا الإشارة إلى هذا الحرف باسم '0' أو 48.
نفس الشيء يمكن كتابة عبارة if باستخدام الأعداد الصحيحة العشرية على النحو التالي:
كود:
if ((rx_byte >= 48) && (rx_byte <= 57)) {
}
سيفعل هذا الكود تمامًا نفس عمل الكود الذي يتحقق من الأحرف.
إذا كان الحرف الذي تم استقباله هو أحد أحرف الأرقام ، فسيتم طباعة حرف الرقم. تهتم عبارة else بأي حرف ليس حرفًا لرقم .
الحصول على إدخال السلسلة Getting String Input
تم استخدام البرنامج السابق للحصول على ومعالجة حرف واحد في كل مرة. سيكون أكثر فائدة إذا تمكنا من الحصول على سلسلة كاملة في كل مرة ، ثم يمكننا الحصول على اسم كدخل ، أو عدد number يتكون من أكثر من رقم digit واحد.
إيجاد نهاية سلسلة Finding the End of a String
السلسلة String هي سلسلة series من الأحرف. حتى نتمكن من قراءة سلسلة من المنفذ التسلسلي في Arduino ، سنحتاج إلى معرفة متى تنتهي السلسلة. إحدى الطرق للقيام بذلك هي إدراج حرف سطر جديد newline في نهاية السلسلة. حرف سطر جديد هو حرف ASCII غير قابل للطباعة يسمى "تغذية السطر" "line feed" في جدول كود ASCII.
حرف line feed له القيمة 10 عشرى ولكن يمكن كتابته كرمز هروب escape في برنامج الاردوينو على النحو التالي: '\n' .
البرنامج التالي هو نسخة معدلة من البرنامج السابق. بالإضافة إلى التحقق مما إذا تم استلام رقم number أو غير رقم non-number ، فإنه يتحقق أيضًا من استلام حرف السطر الجديد newline .
عند تشغيل البرنامج وإرسال حرف من نافذة Serial Monitor ، يجب تغيير إعداد في أسفل نافذة Serial Monitor بحيث يتم إلحاق حرف سطر جديد بالحرف المرسل كما هو موضح في الصورة أسفل البرنامج .
كود:
void setup() {
Serial.begin(9600);
}
char rx_byte = 0;
void loop() {
if (Serial.available() > 0) { // is a character available?
rx_byte = Serial.read(); // get the character
// check if a number was received
if ((rx_byte >= '0') && (rx_byte <= '9')) {
Serial.print("Number received: ");
Serial.println(rx_byte);
}
else if (rx_byte == '\n') {
Serial.println("Newline");
}
else {
Serial.println("Not a number.");
}
} // end: if (Serial.available() > 0)
}
قبل تشغيل البرنامج ، تأكد من ضبط نافذة شاشة Arduino Serial Monitor على "Newline" كما هو موضح في هذه الصورة.

عندما يتم تعيين "Newline" في نافذة Serial Monitor ، فإن كل ما يتم كتابته في حقل "send" في نافذة Serial Monitor ، سيتبعه حرف سطر جديد.
تم استخدام else if لاختبار إذا ما تم تلقي حرف سطر جديد كما هو موضح في هذا السطر من التعليمات البرمجية.
كود:
else if (rx_byte == '\n') {
يتحقق هذا الكود من وجود حرف السطر الجديد الذي يمثله '\n' ويطبع "Newline" في نافذة Serial Monitor إن وجدت.
قراءة سلسلة Reading a String
يقرأ البرنامج أدناه سلسلة في Arduino ويستخدم حرف السطر الجديد لتحديد متى تنتهي السلسلة.
كود:
void setup() {
Serial.begin(9600);
Serial.println("Enter your name.");
}
char rx_byte = 0;
String rx_str = "";
void loop() {
if (Serial.available() > 0) { // is a character available?
rx_byte = Serial.read(); // get the character
if (rx_byte != '\n') {
// a character of the string was received
rx_str += rx_byte;
}
else {
// end of string
Serial.print("Welcome ");
Serial.println(rx_str);
rx_str = ""; // clear the string for reuse
Serial.println("");
Serial.println("Enter your name.");
}
} // end: if (Serial.available() > 0)
}
يتم الحصول على كل حرف فردي من السلسلة بنفس الطريقة مثل البرامج السابقة وتخزينها في المتغير rx_byte.
إذا لم يكن الحرف مساويًا لحرف السطر الجديد ، فسيتم إضافته إلى الكائن rx_str للفئة String.
كود:
if (rx_byte != '\n') {
// a character of the string was received
rx_str += rx_byte;
}
سطر الكود
بالضبط مثل:
كود:
rx_str = rx_str + rx_byte;
فهو ببساطة يضع كل حرف في نهاية السلسلة لبناء السلسلة من الأحرف المستلمة.
بعد تجميع السلسلة ، سيتم استلام حرف السطر الجديد الذي سيقوم بعد ذلك بتشغيل عبارة else ويتم طباعة السلسلة المستلمة إلى نافذة Serial Monitor كجزء من رسالة ترحيب.
الحصول على رقم Getting a Number
عندما يتم استلام رقم من نافذة Serial Monitor ، فإنه يكون عبارة عن سلسلة من أحرف الأرقام ويجب تحويلها إلى رقم يمكن تخزينه في متغير لرقم مثل عدد صحيح أو int .
يتحقق البرنامج التالي لمعرفة أن الأحرف المستلمة هي أحرف رقمية ثم يحول الرقم إلى عدد صحيح.
كود:
void setup() {
Serial.begin(9600);
Serial.println("Enter a number to multiply by 2.");
}
char rx_byte = 0;
String rx_str = "";
boolean not_number = false;
int result;
void loop() {
if (Serial.available() > 0) { // is a character available?
rx_byte = Serial.read(); // get the character
if ((rx_byte >= '0') && (rx_byte <= '9')) {
rx_str += rx_byte;
}
else if (rx_byte == '\n') {
// end of string
if (not_number) {
Serial.println("Not a number");
}
else {
// multiply the number by 2
result = rx_str.toInt() * 2;
// print the result
Serial.print(rx_str);
Serial.print(" x 2 = ");
Serial.print(result);
Serial.println("");
Serial.println("Enter a number to multiply by 2.");
}
not_number = false; // reset flag
rx_str = ""; // clear the string for reuse
}
else {
// non-number character received
not_number = true; // flag a non-number
}
} // end: if (Serial.available() > 0)
}
• بناء السلسلة Building the String
يتم بناء سلسلة من الأحرف المستلمة كما تم في البرنامج السابق. إذا كان أي حرف مستلم ليس حرف رقم ، فسيتم تعيين المتغير not_number على true كإشارة أو"علم" flag على أنه تم استلام حرف غير رقمي.
• استخدام العلم المنطقي Using a Boolean Flag
المتغير not_number هو من نوع Boolean (منطقي) يمكن أن يكون له قيمة صواب true أو خطأ false . في البرنامج ، يتم استخدام هذا المتغير كعلامة flag يتم التحقق منها لاحقًا لمعرفة ما إذا تم استلام أي أحرف غير رقمية.
بعد استلام السلسلة الكاملة ، التي تحدث عند استلام حرف السطر الجديد ، يتم التحقق من علامة المتغير not_number ويتم عرض رسالة إذا لم يكن أي حرف تم استلامه رقمًا.
• معالجة السلسلة Processing the String
إذا كانت جميع الأحرف المستلمة عبارة عن أرقام ، يتم تحويل السلسلة إلى عدد صحيح باستخدام rx_str.toInt() ، مضروبة في 2 والنتيجة تخزن في المتغير result . نتيجة الحساب يتم طباعتها في نافذة المراقبة التسلسلية.
• قيود البرنامج Sketch Limitations
هناك بعض القيود على هذا البرنامج . لا يمكننا الحصول على نتيجة عند إرسال رقم سالب إلى Arduino لأن علامة الطرح ستؤدي إلى إنطلاق (تشغيل) علامة المتغير not_number. حجم الرقم الذي يمكن ضربه محدود أيضًا بحجم عدد موجب على Arduino.
|