| |||||||||||||||||
| |||||||||||||||||
| ข้อความ: | ||
การใช้งานการสื่อสารแบบอนุกรมใน Delphi ด้วยการพัฒนาเทคโนโลยีสารสนเทศสมัยใหม่และการใช้เครือข่ายคอมพิวเตอร์อย่างแพร่หลาย เทคโนโลยีการสื่อสารคอมพิวเตอร์จึงมีความสมบูรณ์มากขึ้น อย่างไรก็ตาม การสื่อสารแบบอนุกรมซึ่งเป็นวิธีการสื่อสารที่ยืดหยุ่น สะดวก และเชื่อถือได้ ยังคงเป็นวิธีการสื่อสารที่มีประสิทธิภาพและมีการใช้กันอย่างแพร่หลายในอุตสาหกรรม ควบคุม. ในแนวทางปฏิบัติด้านการผลิตทางอุตสาหกรรม การใช้พีซีเพื่อตรวจสอบโครงการแบบเรียลไทม์มักจะกำหนดให้พีซีมีฟังก์ชันต่างๆ เช่น การรวบรวมข้อมูล การประมวลผลข้อมูล และการควบคุมการสร้างและการส่งสัญญาณบนอินเทอร์เฟซผู้ใช้ ในสภาพแวดล้อมเฉพาะนี้ หากพีซีเชื่อมต่อกับสัญญาณการควบคุมกระบวนการแบบเรียลไทม์ จะต้องใช้งานพอร์ตอนุกรมของพีซีโดยตรง Delphi เปิดตัวโดย Borland เป็นภาษาการเขียนโปรแกรมระดับสูงที่ทรงพลังพร้อมคุณสมบัติเชิงวัตถุเชิงภาพ และเหมาะอย่างยิ่งสำหรับการเตรียมอินเทอร์เฟซแบบกราฟิกและโปรแกรมผู้ใช้ในสภาพแวดล้อม Windows กลไกการสื่อสารแบบอนุกรมที่ใช้ WIN95/NT กลไกของระบบปฏิบัติการ Windows ห้ามไม่ให้แอปพลิเคชันเข้าถึงฮาร์ดแวร์คอมพิวเตอร์โดยตรง แต่ให้โปรแกรมเมอร์ด้วยชุดฟังก์ชัน API มาตรฐาน ทำให้การเตรียมแอปพลิเคชันสะดวกยิ่งขึ้นและขจัดปัญหาในการดีบักฮาร์ดแวร์ที่เกี่ยวข้อง ใน Windows 95/NT ข้อความ WM_COMMNOTIFY ดั้งเดิมของ Windows 3 เพียงใช้งานบัฟเฟอร์การอ่าน/เขียน ฟังก์ชันการทำงานการสื่อสารแบบอนุกรมที่ใช้กันทั่วไปหลายอย่างใน WIN95/NT มีดังนี้: CreatFile เปิดพอร์ตอนุกรม CloseHandle ปิดพอร์ตอนุกรม SetupComm กำหนดขนาดของบัฟเฟอร์การสื่อสาร ReadFile อ่านการทำงานของพอร์ตอนุกรม WriteFile เขียนการดำเนินการพอร์ตอนุกรม SetCommState ตั้งค่าพารามิเตอร์การสื่อสาร GetCommState รับพารามิเตอร์การสื่อสารเริ่มต้น ClearCommError จะล้างข้อผิดพลาดของพอร์ตอนุกรมและรับสถานะปัจจุบัน นอกเหนือจากฟังก์ชันข้างต้นแล้ว ยังมักใช้บันทึก DCB (Device Control Block) ที่สำคัญอีกด้วย มีพารามิเตอร์พอร์ตอนุกรมที่กำหนดได้บันทึกไว้ใน DCB เมื่อตั้งค่าพารามิเตอร์พอร์ตอนุกรมคุณต้องใช้ฟังก์ชัน GetCommState เพื่อกรอกค่าเริ่มต้นของระบบลงในบล็อกควบคุม DCB จากนั้นตั้งค่าที่กำหนดเองที่ผู้ใช้ อยากเปลี่ยนแปลง เพื่อดำเนินการสื่อสารแบบอนุกรมใน WIN95/NT นอกเหนือจากการทำความเข้าใจฟังก์ชันการดำเนินการสื่อสารขั้นพื้นฐานแล้ว คุณยังต้องเชี่ยวชาญการเขียนโปรแกรมแบบมัลติเธรดอีกด้วย เธรดคือเส้นทางของการดำเนินการภายในกระบวนการและเป็นเอนทิตีพื้นฐานที่ระบบปฏิบัติการใช้เพื่อจัดสรรเวลา CPU แต่ละกระบวนการเริ่มต้นด้วยเธรดเดียวเพื่อให้การดำเนินการของแอปพลิเคชันเสร็จสมบูรณ์ การสื่อสารแบบอนุกรมจำเป็นต้องดำเนินการโดยใช้เทคโนโลยีมัลติเธรด ตรรกะการประมวลผลหลักสามารถแสดงได้ดังนี้: ที่จุดเริ่มต้นของกระบวนการ เธรดหลักจะดำเนินการเริ่มต้นที่จำเป็น จากนั้นเธรดหลักจะสร้างเธรดการตรวจสอบการสื่อสารเพื่อตรวจสอบ พอร์ตการสื่อสารในเวลาที่เหมาะสมตามความจำเป็น เมื่อเหตุการณ์พอร์ตอนุกรมที่ระบุเกิดขึ้น ข้อความ WM_COMMNOTIFY จะถูกส่งไปยังเธรดหลัก (เนื่องจาก WIN95 ยกเลิกข้อความ WM_COMMNOTIFY คุณต้องสร้างด้วยตนเอง) และเธรดหลักจะประมวลผล ถ้าข้อความ WM_COMMNOTIFY ไม่จำเป็น เธรดหลักยุติเธรดการตรวจสอบการสื่อสาร การดำเนินการหลายเธรดพร้อมกันจะทำให้เกิดความขัดแย้งกับทรัพยากรที่ใช้ร่วมกัน เพื่อหลีกเลี่ยงความขัดแย้ง คุณจำเป็นต้องใช้มัลติเธรดที่ซิงโครไนซ์เพื่อเข้าถึงทรัพยากรที่ใช้ร่วมกัน WIN95 มีวิธีการมากมายในการรักษาการซิงโครไนซ์เธรด ผู้เขียนใช้การสร้างวัตถุเหตุการณ์เพื่อรักษาการซิงโครไนซ์เธรด สร้างออบเจ็กต์เหตุการณ์ผ่าน CraeteEvent() และตั้งค่าออบเจ็กต์เหตุการณ์ให้ส่งสัญญาณการซิงโครไนซ์โดยใช้ฟังก์ชัน etEvent() หรือ PulseEvent() ในแอปพลิเคชัน ให้ใช้ฟังก์ชัน WaitSingleObject() เพื่อรอทริกเกอร์การซิงโครไนซ์ และรอจนกระทั่งเหตุการณ์ที่ระบุได้รับการตั้งค่าให้มีสัญญาณจากเธรดอื่น ก่อนที่จะดำเนินการโปรแกรมต่อไป วิธีการดำเนินการเฉพาะภายใต้ Delphi ฟังก์ชันอันทรงพลังของ Delphi และเทคโนโลยีการเขียนโปรแกรมเชิงวัตถุที่รองรับมัลติเธรดทำให้การสื่อสารแบบอนุกรมเป็นเรื่องง่ายและสะดวกมาก ดำเนินการโดยการเรียกฟังก์ชัน API ภายนอก ขั้นตอนหลักมีดังนี้ ขั้นแรก ใช้ฟังก์ชัน CreateFile เพื่อเปิดพอร์ตอนุกรมเพื่อระบุความเป็นเจ้าของพอร์ตอนุกรมโดยแอปพลิเคชันนี้ และบล็อกแอปพลิเคชันอื่นไม่ให้ใช้งานพอร์ตอนุกรม กรอกบล็อกควบคุมอุปกรณ์ DCB ผ่านฟังก์ชัน GetCommState จากนั้นกำหนดค่าอัตรารับส่งข้อมูล บิตข้อมูล บิตพาริตี และบิตหยุดของพอร์ตอนุกรมโดยการเรียกใช้ฟังก์ชัน SetCommState จากนั้น สร้างเธรดการตรวจสอบพอร์ตอนุกรมเพื่อตรวจสอบเหตุการณ์พอร์ตอนุกรม บนพื้นฐานนี้ คุณสามารถดำเนินการส่งข้อมูลบนพอร์ตอนุกรมที่เกี่ยวข้องได้ ในที่สุด ให้ใช้ฟังก์ชัน CloseHandle เพื่อปิดพอร์ตอนุกรม โปรแกรมเฉพาะมีดังนี้ โปรแกรม: หน่วยคอมเดมู; อินเตอร์เฟซ การใช้งาน Windows, ข้อความ, SysUtils, คลาส, กราฟิก, การควบคุม, แบบฟอร์ม, กล่องโต้ตอบ; ค่าคงที่ Wm_commNotify=Wm_User+12; พิมพ์ TForm1 = คลาส (TForm) PROcedure FormCreate (ผู้ส่ง: TObject); ส่วนตัว ขั้นตอนการทำโฆษณา; ขั้นตอน MsgcommProcess (Var Message: Tmessage); ข้อความ Wm_commnotify; {ประกาศส่วนตัว} สาธารณะ {ประกาศสาธารณะ} จบ; //ประกาศกระทู้ TComm=คลาส(TThread) ได้รับการคุ้มครอง ขั้นตอนดำเนินการ; แทนที่; จบ; var แบบฟอร์ม 1: TForm1; hcom, Post_Event: ธันเดิล; lpol:ยากจน; การดำเนินการ {$R *.DFM} ขั้นตอน TComm.Execute; // กระบวนการดำเนินการของเธรด var dwEvtMask:DWord; รอ:บูลีน; เริ่ม fillchar (lpol, ขนาดของ (ทับซ้อนกัน), 0); ในขณะที่ True do Begin dwEvtMask:=0; รอ:=WaitCommEvent(hcom,dwevtmask,lpol); //รอเหตุการณ์พอร์ตอนุกรม; ถ้ารอแล้วเริ่มต้น waitforsingleobject(post_event,infinite); //รอให้ตั้งค่าเหตุการณ์การซิงโครไนซ์; รีเซ็ตเหตุการณ์ (post_event); // รีเซ็ตเหตุการณ์การซิงโครไนซ์; PostMessage(Form1.Handle,WM_COMMNOTIFY,0,0);//ส่งข้อความ; จบ; จบ; จบ; ขั้นตอน Tform1.comminitialize; // การเริ่มต้นพอร์ตอนุกรม var lpdcb:Tdcb; เริ่ม hcom:=createfile('com2',generic_read หรือ generic_write,0,ไม่มี,open_existing, file_attribute_normal หรือ file_flag_overlipped,0);//เปิดพอร์ตอนุกรม ถ้า hcom=invalid_handle_value แล้ว อื่น setupcomm(hcom,4096,4096); //ตั้งค่าบัฟเฟอร์อินพุตและเอาต์พุตเป็น 4096 ไบต์ getcommstate(hcom,lpdcb); //รับการตั้งค่าเริ่มต้นปัจจุบันของพอร์ตอนุกรม lpdcb.บอดเรต:=2400; lpdcb.StopBits:=1; lpdcb.ByteSize:=8; lpdcb.Parity:=EvenParity; //ความเท่าเทียมกัน Setcommstate(hcom,lpdcb); setcommMask(hcom,ev_rxchar); //ระบุเหตุการณ์พอร์ตอนุกรมเป็นอักขระที่ได้รับ; จบ; ขั้นตอน TForm1.MsgcommProcess (Var Message: Tmessage); var ล้าง:บูลีน; คอม: Tcomstat; cbNum, ReadNumber, lpErrors: จำนวนเต็ม; Read_Buffer:อาร์เรย์[1..100]ของถ่าน; เริ่ม ล้าง:=Clearcommerror(hcom,lpErrors,@Coms); ถ้าชัดเจนแล้วเริ่มต้น cbNum:=Coms.cbInQue; ReadFile(hCom,Read_Buffer,cbNum,ReadNumber,lpol); //ประมวลผลข้อมูลที่ได้รับ SetEvent(Post_Event); //การตั้งค่าเหตุการณ์การซิงโครไนซ์ จบ; จบ; ขั้นตอน TForm1.FormCreate (ผู้ส่ง: TObject); เริ่ม คอมมิชชั่น; post_event:=CreateEvent(nil,true,true,nil); //สร้างเหตุการณ์การซิงโครไนซ์; Tcomm.Create (False); // สร้างเธรดการตรวจสอบพอร์ตอนุกรม จบ; จบ. ชื่อสมาชิกผู้เขียน: ruan_bangqiu | ||