| |||||||||||||||||
| |||||||||||||||||
| نص: | ||
تنفيذ الاتصال التسلسلي في دلفي مع تطور تكنولوجيا المعلومات الحديثة والاستخدام الواسع النطاق لشبكات الكمبيوتر، أصبحت تكنولوجيا الاتصالات الحاسوبية ناضجة بشكل متزايد، ومع ذلك، لا يزال الاتصال التسلسلي، باعتباره وسيلة اتصال مرنة ومريحة وموثوقة، وسيلة اتصال فعالة ويستخدم على نطاق واسع في الصناعة يتحكم. في ممارسة الإنتاج الصناعي، عادةً ما يتطلب استخدام جهاز كمبيوتر لمراقبة المشاريع في الوقت الفعلي أن يكون لجهاز الكمبيوتر وظائف مثل جمع البيانات ومعالجة البيانات والتحكم في توليد الإشارات ونقلها على واجهة المستخدم. في هذه البيئة المحددة، إذا كان الكمبيوتر متصلاً بإشارات التحكم في العملية في الوقت الفعلي، فمن الضروري تشغيل المنفذ التسلسلي للكمبيوتر مباشرة. تعد لغة دلفي التي أطلقها بورلاند لغة برمجة قوية عالية المستوى ذات ميزات مرئية موجهة للكائنات وهي مناسبة بشكل خاص لإعداد الواجهات الرسومية وبرامج المستخدم في بيئة Windows. آلية الاتصال التسلسلي على أساس WIN95/NT تمنع آلية نظام التشغيل Windows التطبيقات من الوصول مباشرة إلى أجهزة الكمبيوتر، ولكنها توفر للمبرمجين سلسلة من وظائف API القياسية، مما يجعل إعداد التطبيق أكثر ملاءمة ويزيل مشكلة تصحيح أخطاء الأجهزة ذات الصلة. في نظام التشغيل Windows 95/NT، رسالة WM_COMMNOTIFY الأصلية لنظام التشغيل Windows 3. ما عليك سوى العمل على المخزن المؤقت للقراءة/الكتابة. العديد من وظائف عملية الاتصال التسلسلي شائعة الاستخدام في WIN95/NT هي كما يلي: يفتح CreatFile المنفذ التسلسلي يقوم CloseHandle بإغلاق المنفذ التسلسلي يقوم SetupComm بتعيين حجم المخزن المؤقت للاتصالات يقرأ ReadFile عملية المنفذ التسلسلي يكتب WriteFile عملية المنفذ التسلسلي يقوم SetCommState بتعيين معلمات الاتصال يحصل GetCommState على معلمات الاتصال الافتراضية يقوم ClearCommError بمسح خطأ المنفذ التسلسلي والحصول على الحالة الحالية بالإضافة إلى الوظائف المذكورة أعلاه، غالبًا ما يتم استخدام سجل DCB (كتلة التحكم في الجهاز) المهم. هناك معلمات منفذ تسلسلي محددة مسجلة في DCB. عند تعيين معلمات المنفذ التسلسلي، يجب عليك أولاً استخدام وظيفة GetCommState لملء القيم الافتراضية للنظام في كتلة التحكم DCB، ثم تعيين القيم المخصصة التي يريدها المستخدم. يريد التغيير. لإجراء الاتصال التسلسلي في WIN95/NT، بالإضافة إلى فهم وظائف عملية الاتصال الأساسية، يجب عليك أيضًا إتقان البرمجة متعددة الخيوط. الخيط هو مسار التنفيذ داخل العملية وهو الكيان الأساسي الذي يستخدمه نظام التشغيل لتخصيص وقت وحدة المعالجة المركزية. تبدأ كل عملية بخيط واحد لإكمال تنفيذ التطبيق. يجب تنفيذ الاتصال التسلسلي باستخدام تقنية الخيوط المتعددة، ويمكن التعبير عن منطق المعالجة الرئيسي الخاص به على النحو التالي: في بداية العملية، يقوم الخيط الرئيسي ببعض أعمال التهيئة الضرورية، ثم يقوم الخيط الرئيسي بإنشاء خيط مراقبة الاتصال للمراقبة. منفذ الاتصال في الوقت المناسب حسب الحاجة. عند حدوث حدث المنفذ التسلسلي المحدد، يتم إرسال رسالة WM_COMMNOTIFY إلى مؤشر الترابط الرئيسي (بما أن WIN95 يلغي رسالة WM_COMMNOTIFY، فيجب عليك إنشائها بنفسك)، ويقوم مؤشر الترابط الرئيسي بمعالجتها. إذا لم تكن هناك حاجة إلى رسالة WM_COMMNOTIFY، فسيقوم مؤشر الترابط الرئيسي بإنهاء مؤشر ترابط مراقبة الاتصال. سيؤدي التنفيذ المتزامن لخيوط متعددة إلى حدوث تعارضات على الموارد المشتركة. لتجنب التعارضات، من الضروري استخدام مؤشرات الترابط المتعددة المتزامنة للوصول إلى الموارد المشتركة. يوفر WIN95 العديد من الطرق للحفاظ على تزامن مؤشر الترابط. يستخدم المؤلف إنشاء كائنات الأحداث للحفاظ على تزامن مؤشر الترابط. قم بإنشاء كائن حدث من خلال CraeteEvent() وقم بتعيين كائن الحدث لمزامنة الإشارة باستخدام وظيفة etEvent() أو PulseEvent(). في التطبيق، استخدم وظيفة WaitSingleObject() لانتظار مشغل المزامنة، وانتظر حتى يتم تعيين الحدث المحدد ليحصل على إشارة بواسطة سلاسل رسائل أخرى قبل متابعة تنفيذ البرنامج. طريقة التنفيذ المحددة في دلفي وظائف دلفي القوية وتقنية البرمجة الموجهة للكائنات التي تدعم الخيوط المتعددة تجعل الاتصال التسلسلي بسيطًا ومريحًا للغاية. يتم تنفيذه عن طريق استدعاء وظائف واجهة برمجة التطبيقات الخارجية. الخطوات الرئيسية هي كما يلي: أولاً، استخدم وظيفة CreateFile لفتح المنفذ التسلسلي لتحديد ملكية المنفذ التسلسلي بواسطة هذا التطبيق وحظر التطبيقات الأخرى من تشغيل المنفذ التسلسلي؛ ، املأ كتلة التحكم في الجهاز DCB من خلال وظيفة GetCommState، ثم قم بتكوين معدل البث بالباود وبتات البيانات وبتات التكافؤ وبتات التوقف للمنفذ التسلسلي عن طريق استدعاء وظيفة SetCommState. ثم قم بإنشاء مؤشر ترابط لمراقبة المنفذ التسلسلي لمراقبة أحداث المنفذ التسلسلي. على هذا الأساس، يمكنك تشغيل نقل البيانات على المنفذ التسلسلي المقابل، وأخيرًا، استخدم وظيفة CloseHandle لإغلاق المنفذ التسلسلي. البرنامج المحدد هو كما يلي. تم تجميع هذا البرنامج باستخدام Delphi3.0 وتصحيح أخطائه في بيئة Win95 وقد تم وضعه في التطبيق العملي كمرجع للقراء. برنامج: وحدة كومديمو؛ واجهة الاستخدامات Windows، الرسائل، SysUtils، الفئات، الرسومات، عناصر التحكم، النماذج، مربعات الحوار؛ ثابت Wm_commNotify=Wm_User+12; يكتب TForm1 = الفئة (TForm) PROcedure FormCreate(Sender: TObject); خاص تبسيط الإجراءات؛ الإجراء MsgcommProcess(Var message:Tmessage); {تصريحات خاصة} عام {التصريحات العامة} نهاية؛ // إعلان الموضوع TComm=الفئة(TThread) محمي تنفيذ الإجراء؛ تجاوز؛ نهاية؛ فار Form1: TForm1؛ hcom,Post_Event:Thandle; lpol:متداخل; تطبيق {$R *.DFM} الإجراء TComm.Execute؛ // عملية تنفيذ الموضوع فار dwEvtMask:DWord; انتظر: منطقي؛ يبدأ fillchar(lpol,sizeof(toverlapped),0); بينما صحيح أن تبدأ dwEvtMask:=0; Wait:=WaitCommEvent(hcom,dwevtmask,lpol); // انتظر أحداث المنفذ التسلسلي; إذا انتظر ثم ابدأ waitforsingleobject(post_event,infinite); // انتظر حتى يتم تعيين حدث المزامنة; إعادة تعيين الحدث (post_event) ؛ // إعادة تعيين حدث المزامنة ؛ PostMessage(Form1.Handle,WM_COMMNOTIFY,0,0);//أرسل رسالة; نهاية؛ نهاية؛ نهاية؛ الإجراء Tform1.comminitialize; // تهيئة المنفذ التسلسلي فار lpdcb:Tdcb; يبدأ hcom:=createfile('com2',generic_read أو generic_write,0,nil,open_existing, file_attribute_normal أو file_flag_overlapped,0);// افتح المنفذ التسلسلي إذا hcom=invalid_handle_value إذن آخر setupcomm(hcom,4096,4096); // اضبط المخازن المؤقتة للإدخال والإخراج على 4096 بايت getcommstate(hcom,lpdcb); // احصل على الإعدادات الافتراضية الحالية للمنفذ التسلسلي lpdcb.baudrate:=2400; lpdcb.StopBits:=1; lpdcb.ByteSize:=8; lpdcb.Parity:=EvenParity; Setcommstate(hcom,lpdcb); setcommMask(hcom,ev_rxchar); // حدد حدث المنفذ التسلسلي كأحرف مستلمة؛ نهاية؛ الإجراء TForm1.MsgcommProcess(Var message:Tmessage); فار واضح: منطقي؛ كومز:كومستات؛ cbNum,ReadNumber,lpErrors:Integer; Read_Buffer:صفيف[1..100]من الحرف؛ يبدأ Clear:=Clearcommerror(hcom,lpErrors,@Coms); إذا امسح ثم ابدأ cbNum:=Coms.cbInQue; ReadFile(hCom,Read_Buffer,cbNum,ReadNumber,lpol); // معالجة البيانات المستلمة SetEvent(Post_Event); // إعداد حدث المزامنة نهاية؛ نهاية؛ الإجراء TForm1.FormCreate(Sender: TObject); يبدأ تبسيط؛ post_event:=CreateEvent(nil,true,true,nil); Tcomm.Create(False); // إنشاء مؤشر ترابط لمراقبة المنفذ التسلسلي ؛ نهاية؛ نهاية. اسم العضو المؤلف: ruan_bangqiu | ||