إرسال وإستقبال البيانات عن طريق سيريال بورت - سي شارب - مقـــالات - Top Coder
Welcome to our Site
الدخــول Or تسجـــيل
السبت
2016-12-10
5:35 PM
تسجــــيل | دخـــول
الرئيسية » مقالات » سي شارب

إرسال وإستقبال البيانات عن طريق سيريال بورت
إرسال وإستقبال البيانات عن طريق سيريال بورت

مقدمه
أولا : نبذة عن الاتصال المتوالي Serial Communication
- طريقة ارسال البيانات هي ارسال بت واحد تلو الاخر أي متوالي على عكس Parellel Communication اي الاتصال المتوازي والذي يتم فيه ارسال بايت تلو الاخر
- يكون الارسال على الشكل الاتي
بت ( لمعرفة بداية الارسال ) + الداتا ( يمكن ان تكون 5 بت او 6 بت او 7 بت او 8 بت ) + بت النهاية ( يمكن ان يكون بت واحد او واحد ونص او اثنان بت )
- هناك بت اضافي يمكن ان يضاف الى الرسالة للتحقق من صحة البيانات ( لا يقوم بتصحيح الخطأ وانما لاكتشاف الخطأ فقط ) وهناك 4 طرق لهذه الخاصية ( لن نخوض فيها )

-- الاتصال المتوالي لا يعني بالضرورة وجود كابل متوالي Serial Cable
وانما هو طريقة اتصال بين جهازيين بالصورة التي شرحناها بالاعلى فعلى سبيل المثال جميع الاجهزة التي تستخدم تقنية Bluetooth للاتصال فيما بينها تستخدم طريقة الاتصال المتوالي

لذلك لكي نستطيع تجربة تلك البرامج هناك اكثر من طريقة :-
- الاتصال بين جهازي كمبيوتر بكابل متوالي Serial Cable
- الاتصال بين مخرجين Serial Ports على نفس الجهاز بكابل متوالي.
- استخدام Bluetooth Adapter بين حهازين .
- استخدام كابل محول بين Serial Port and USB او بمعنى اخر Serial - to - USB cable للربط بين مخرج serial ومخرج USB
سيريال شات
بعد هذه المقدمة البسيطة عن الاتصال المتوالي ومتطلبات اختبار برامجنا نأتي الى اول برامجنا .

البرنامج الأول : برنامج محادثة عن طريق الاتصال المتوالي
- ننشأ برنامج ويندوز جديد وليكن اسمه SerialChat

وهي تحتوي على الاتي :-
- كمبوبوكس ComboBox: لتخزين اسماء Serial Ports المنافذ المتاحة على الكمبيوتر.
اسمها :
ccbCOMPorts
- تكست بوكس TextBox: للنص المراد ارساله
اسمها : txtDataToSend
مع جعلها تقبل تعدد السطور
mutliLine : true
- ريتش تكست بوكس RichTextBox: للنص المستقبل
اسمها : txtDataReceived
مع جعلها تقبل تعدد السطور
جعل الخاصية ScrollBar رأسية
Scrollbar : vertical
- بعض الازرار ووظيفتها ظاهرة من اسمها في الصورة وهم :
btnConnect لبدء الاتصال
btnDisconnect لانهاء الاتصال
btnSend لارسال النص
- اداة عنوان Label : لعرض حالة الاتصال
اسمها : lblMessage

للتعامل مع Serial Port هناك اداة موجودة في صندوق الادوات تسمى SerialPort تجدها في تصنيف Components
يمكنها ان تضيفها الى الفورم او ننشأ كائن منه عن طريق الكود وهو ما سنستخدمه هنا .

نبدأ بإنشاء كائن من كلاس SerialPort
seial port object
 
في حدث التحميل للفورم نجلب اسماء جميع المنافذ المتوالية Serial Ports المتاحة بالكمبيوتر بالشكل الاتي  
Get Serial Ports
 
في حدث الضغط على زرار الاتصال ننفذ الكود التالي
Connect  
 
قبل المضي قدما بالبرنامج نشرح الخصائص التي حددناها بالكود وهي :-
- PortName : اسم المنفذ والذي تم اختياره من الكمبوبوكس
- BaudRate : وهي سرعة الاتصال وتقاس بالبت في الثانية b/s
- prity: وهي اسلوب اكتشاف الخطأ الذي ذكرناه في المقدمة والقيمة كما نرى تأتي من enum خاص بالكلاس والقيمة None تعني اننا لن نستخدم اسلوب اكتشاف الخطأ بمعنى انه لن يتم اضافة البت الخاص به .
- DataBits : وهي عدد البت الخاص بالداتا وكما ذكرنا يمكن ان تكون 4 , 5 , 6, 7 , 8
- StopBit : وهي البت التي تحدد نهاية الرسالة المرسلة والتي كما ذكرنا يمكن ان تكون 1 , 1.5 ، 2
- Encoding : تخص نوع تشفير البيانات المرسلة ( الافتراضي هو ASCII ويمكن ان لا نحددها اذا كانت الرسالة باللغة الانجليزية اما اذا كانت الرسالة باللغة العربية فيتعين علينا تحديده بالقيمة الموجودة بالكود Unicode )

في حدث الضغط على زرار انهاء الاتصال ننفذ الكود التالي :-
Disconnect
 
في حدث الضغط على زرار ارسال ننفذ الكود التالي
Send
 
لارسال الرسالة نستخدم الدالة Write الخاصة بالكائن serialPort والتي تستقبل متغير من النوع نص string وهي الرسالة المراد ارسالها , او مصفوفة من الحروف , او مصفوفة من النوع Byte

والدالة ScrollToCaret الخاصة بـ RichTextBox تقوم بتحريك ScrollBar الى اسفل لكي يظهر الجزء الموجود به النص الجديد


نلاحظ ان عملية الارسال سهلة فقط استخدام الدالة Write , أما لاستقبال البيانات من المنفذ فهناك بعض الامور التي يجب معرفتها

فهناك حدث خاص بالاداة Serial Port وهو DataReceived وهذا الحدث يتم تفعيله عند استقبال المنفذ اي بيانات اتوماتيكيا
لذا اذا كنا استخدمنا الاداة الموجودة بصندوق الادوات ووضعها على الفورم , فعند رؤية الاحداث الخاصة بها سنرى هذا الحدث في صندوق الخصائص ونكتب الكود المراد تنفيذه , أما في حالتنا هذه وقد قمنا بانشاء كائن من الاداة باستخدام الكود فيتعين علينا اضافة EventHandler الخاص بهذا الحدث بالشكل الاتي :-
DataReceived  Event
 
أيضا يجب معرفة أنه لا نستطيع قراءة الرسالة المستقبلة وعرضها مباشرة على الاداة الخاصة بعرض الرسائل وذلك لأنه يتم استقبال البيانات من المنفذ على Thread أخر غير الرئيسي الذي تم تنفيذ البرنامج عليه ( Thread : تقسيم فرضي للمعالج لكي يستطيع تنفيذ اكثر من عملية في نفس الوقت ) وهذا يعني اننا لن نستطيع تحديث الادوات الموجودة على الفورم( اي الموجودة على Thread الرئيسي للبرنامج ).
لذلك نستخدم الدالة BeginInvoke والتي تمكننا من التعامل مع Thread اخر غير الرئيسي , لكن هذه الدالة تأخذ متغير من النوع Delegate .
لذلك علينا ان ننشأ Delegate جديد وبه الدالة ننشأ الدالة التي ستقوم بتحديث الادوات على الفورم بالشكل الاتي :-
 
 
وداخل حدث الاستقبال يوضع الكود
Recieve
 
نلاحظ اننا في حالة استقبال رسالة باللغة الانجليزية ASCII code نستخدم الدالة ReadExisting الموجودة بالكلاس SerialPort أما في حالة استقبال رسالة باللغة العربية Unicode لا نستطيع استخدام هذه الدالة وبدلا منها نستخدم الدالة Read


بهذا نكون قد انتهينا من أول برامجنا في التعامل مع Serial Communication او الاتصال المتوالي

اتمنى ان يكون الموضوع سهل والشرح والكود مفهوم وغير مبهم .
المصـــــــــــدر
تحميل المشروع
 Written by :  Mohammed Mahmoud
الفئة: سي شارب | أضاف: ham_mody2000 (2013-05-21 11:04 AM)
مشاهده: 4287 | الترتيب: 0.0/0


أترك تعليقك من خلال حسابك على الفيس بوك

تعليقات مشتركي الموقع

مجموع المقالات: 0
إضافة تعليق يستطيع فقط المستخدمون المسجلون
[ التسجيل | دخول ]
طريقة الدخول
بحث
Our Facebook community

تم إطلاق صفحة توب كودر على الفيس بوك

Advertisment
الأحـــدث
hitstatus
Copyright Mohammed Mahmoud © 2016
إنشاء موقع مجاني с uCoz