Delphi เป็นเครื่องมือพัฒนาแอปพลิเคชั่นแบบมองเห็นได้รวดเร็วพร้อมข้อดีของฟังก์ชันอันทรงพลัง ใช้งานง่าย และการรันโค้ดที่รวดเร็ว มีบทบาทสำคัญมากขึ้นในการสร้างระบบข้อมูลระดับองค์กร . อย่างไรก็ตาม สิ่งที่น่าสังเกตในครีมก็คือ Delphi ไม่มีการควบคุมการสื่อสารแบบอนุกรมของตัวเอง และไม่มีการเอ่ยถึงการสื่อสารแบบอนุกรมในเอกสารวิธีใช้ ซึ่งนำความไม่สะดวกมาสู่นักพัฒนาที่รวบรวมโปรแกรมการสื่อสาร
ปัจจุบันมีวิธีการที่ใช้กันทั่วไปสามวิธีในการใช้การสื่อสารแบบอนุกรมโดยใช้ Delphi: วิธีหนึ่งคือการใช้การควบคุม เช่น การควบคุม MSCOMM และการควบคุม SPCOMM; อีกวิธีหนึ่งคือการใช้ฟังก์ชัน API; วิธีที่สามคือการเรียกโปรแกรมการสื่อสารแบบอนุกรมอื่น ๆ ในหมู่พวกเขา การใช้ API ในการเขียนโปรแกรมการสื่อสารแบบอนุกรมมีความซับซ้อนมากขึ้นและต้องใช้ความรู้ด้านการสื่อสารเป็นจำนวนมาก เมื่อเปรียบเทียบกันแล้ว การใช้ตัวควบคุม SPCOMM นั้นค่อนข้างง่าย และตัวควบคุมมีคุณสมบัติและเหตุการณ์มากมายที่เกี่ยวข้องอย่างใกล้ชิดกับการสื่อสารด้วยพอร์ตอนุกรม ให้การดำเนินการต่างๆ บนพอร์ตอนุกรม และยังรองรับมัลติเธรดอีกด้วย บทความต่อไปนี้แนะนำการใช้ตัวควบคุม SPCOMM โดยละเอียดพร้อมตัวอย่าง
การติดตั้ง SPCOMM
1. เลือกตัวเลือกติดตั้งส่วนประกอบในเมนูแบบเลื่อนลงส่วนประกอบกรอกเส้นทางที่ตัวควบคุม SPCOMM อยู่ในชื่อไฟล์ Unit สามารถใช้ค่าเริ่มต้นสำหรับรายการอื่น ๆ แล้วคลิกปุ่มตกลง
2. หลังการติดตั้ง COM ควบคุมสีแดงจะปรากฏในแผงควบคุมระบบ ตอนนี้คุณสามารถใช้การควบคุม COM ได้เหมือนกับการควบคุมของ Delphi
คุณสมบัติ วิธีการ และเหตุการณ์ของ SPCOMM
1.คุณสมบัติ
●CommName: ระบุชื่อของพอร์ตอนุกรม เช่น COM1 และ COM2;
●BaudRate: อัตรารับส่งข้อมูลที่ตั้งไว้ตามความต้องการที่แท้จริง นอกจากนี้ ค่านี้สามารถเปลี่ยนแปลงได้หลังจากเปิดพอร์ตอนุกรม และอัตรารับส่งข้อมูลจริงจะเปลี่ยนไปตามนั้น
●ParityCheck: ระบุว่าจำเป็นต้องมีการตรวจสอบ Parity หรือไม่
●ByteSize: ความยาวไบต์ที่กำหนดตามสถานการณ์จริง
●ความเท่าเทียมกัน: บิตความเท่าเทียมกัน;
●StopBits: หยุดบิต;
●SendDataEmpty: นี่คือแอตทริบิวต์บูลีน แสดงว่าบัฟเฟอร์การส่งว่างเปล่า หรือไม่มีข้อมูลในคิวการส่ง เมื่อเป็นเท็จ แสดงว่าบัฟเฟอร์การส่งไม่ว่างเปล่า หรืออยู่ที่นั่น เป็นข้อมูลที่อยู่ในคิวการส่ง
2. วิธี
●วิธี Startcomm ใช้ในการเปิดพอร์ตอนุกรม เมื่อการเปิดล้มเหลว มักจะรายงานข้อผิดพลาด มีข้อผิดพลาดเจ็ดประเภทหลัก: ⑴ ไม่สามารถติดตั้งแคชการสื่อสาร ⑸ ไม่สามารถสร้างเหตุการณ์ได้ ไม่สามารถสร้างกระบวนการอ่านได้ ⑺ ไม่สามารถสร้างกระบวนการเขียนได้
●วิธี StopComm ใช้เพื่อปิดพอร์ตอนุกรมและไม่มีค่าส่งคืน
●WriteCommData(pDataToWrite: PChar;dwSizeofDataToWrite:Word) เป็นฟังก์ชันที่มีค่าส่งคืนแบบบูลีน ใช้เพื่อส่งสตริงไปยังกระบวนการเขียน โดยจะคืนค่าเป็นจริงหากการส่งสำเร็จและเป็นเท็จหากการส่งล้มเหลว การดำเนินการฟังก์ชันนี้จะได้รับค่าส่งคืนทันที และการดำเนินการส่งจะดำเนินการในภายหลัง ฟังก์ชันนี้มีพารามิเตอร์สองตัว โดยที่ pDataToWrite คือสตริงที่จะส่ง และ dwSizeofDataToWrite คือความยาวของสตริงที่จะส่ง
3. เหตุการณ์
●OnReceiveData :PROcedure (ผู้ส่ง: TObject;บัฟเฟอร์: ตัวชี้;BufferLength: Word) ของวัตถุ
เหตุการณ์นี้จะถูกทริกเกอร์เมื่อมีการป้อนข้อมูลลงในบัฟเฟอร์ ซึ่งสามารถประมวลผลข้อมูลที่ได้รับจากพอร์ตอนุกรมได้ Buffer ประกอบด้วยข้อมูลที่ได้รับ และ BufferLength คือความยาวของข้อมูลที่ได้รับ
●OnReceiveError: ขั้นตอน (ผู้ส่ง: TObject; EventMask: DWORD)
เหตุการณ์นี้จะเกิดขึ้นเมื่อมีข้อผิดพลาดในการรับข้อมูล
การใช้ SPCOMM
ต่อไปนี้เป็นตัวอย่างของการสื่อสารแบบอนุกรมโดยใช้การควบคุม SPCOMM
ยกตัวอย่างการสื่อสารระหว่างพีซีและไมโครคอนโทรลเลอร์ 8051 เราต้องปรับสัญญาณจับมือระหว่างกันก่อน สมมติว่าโปรโตคอลการสื่อสารระหว่างกันคือ: หนึ่งเฟรมของข้อมูลจาก PC ถึง 8051 คือ 6 ไบต์ และหนึ่งเฟรมของข้อมูลจาก 8051 ไปยัง PC ก็มีขนาด 6 ไบต์เช่นกัน เมื่อพีซีส่ง (F0,01,FF,FF,01,F0), 8051 สามารถรับเฟรม (F0,01,FF,FF,01,F0) ซึ่งบ่งชี้ว่าการจับมือการสื่อสารข้อมูลสำเร็จ และทั้งสองสามารถปฏิบัติตามได้ โปรโตคอลจะถ่ายโอนข้อมูลระหว่างกัน
สร้างโปรเจ็กต์ใหม่ COMM.DPR ตั้งค่าคุณสมบัติ NAME ของฟอร์มเป็น FCOMM กำหนดชื่อของฟอร์มเป็น Test Communication และเพิ่มตัวควบคุมที่เกี่ยวข้อง
1. ตั้งค่าคุณลักษณะ COMM1:
●อัตรารับส่งข้อมูล: 4800;
●บิตพาริตี: ไม่มี;
●ความยาวไบต์: 8;
●หยุดบิต: 1;
●พอร์ตอนุกรม: COM1.
ข้อมูลที่ส่งและรับจะแสดงใน Memo1 เก็บแบบฟอร์มใหม่เป็น Comm.pas
2.เขียนซอร์สโค้ด
//คำอธิบายตัวแปร
var
fcomm:TFCOMM;
วิวสตริง:สตริง;
ฉัน:จำนวนเต็ม;
rbuf,sbuf:array[16] ของไบต์;
//เปิดพอร์ตอนุกรม
ขั้นตอน TFCOMM.FormShow (ผู้ส่ง: TObject);
เริ่ม
comm1.StartComm;
จบ;
//ปิดพอร์ตอนุกรม
ขั้นตอน TFCOMM.FormClose (ผู้ส่ง: TObject; var Action: TCloseAction);
เริ่ม
comm1.StopComm;
จบ;
//ปรับแต่งกระบวนการส่งข้อมูล
ขั้นตอนการส่งข้อมูล;
var
ฉัน:จำนวนเต็ม;
comflg:บูลีน;
เริ่ม
สตริงการดู:='';
comflg:=true;
สำหรับ i:=1 ถึง 6 ทำ
เริ่ม
ถ้าไม่ใช่ fcomm.comm1.writecommdata(@sbuf[i],1) แล้ว
เริ่ม
comflg:=false;
หยุดพัก;
จบ;
// หน่วงเวลาระหว่างไบต์เมื่อส่ง
นอนหลับ(2);
viewstring:=viewstring+intttohex(sbuf[i],2)+'';
viewstring:='ส่ง'+viewstring;
fcomm.memo1.lines.add(สตริงการดู);
fcomm.memo1.lines.add('' );
ถ้าไม่ใช่ comflg ก็ messagedlg ('การส่งล้มเหลว!', mterror, [mbyes], 0);
จบ;
//เหตุการณ์คลิกปุ่มส่ง
ขั้นตอน TFCOMM.Btn_sendClick (ผู้ส่ง: TObject);
เริ่ม
sbuf[1]:=byte($ f0); //ส่วนหัวของเฟรม
sbuf[2]:=byte($ 01); //หมายเลขคำสั่ง
sbuf[3]:=ไบต์($ ff);
sbuf[4]:=ไบต์($ ff);
sbuf[5]:=ไบต์($ 01);
sbuf[6]:=byte($ f0); //สิ้นสุดเฟรม
senddata;//เรียกใช้ฟังก์ชัน send
จบ;
//ขั้นตอนการรับ
ขั้นตอน TFCOMM.Comm1ReceiveData (ผู้ส่ง: TObject; บัฟเฟอร์: ตัวชี้; BufferLength: Word);
var
ฉัน:จำนวนเต็ม;
เริ่ม
สตริงการดู:='';
ย้าย (บัฟเฟอร์ ^, pchar (@ rbuf ^), ความยาวบัฟเฟอร์);
สำหรับ i:=1 ถึงความยาวบัฟเฟอร์ทำ
viewstring:=viewstring+intttohex(rbuf[i],2)+'';
viewstring:='receive'+viewstring;
memo1.lines.add(สตริงการดู);
memo1.lines.add('' );
จบ;
หาก memo1 แสดงการส่ง F0 01 FF FF 01 F0 และรับ F0 01 FF FF 01 F0 หมายความว่าพอร์ตอนุกรมส่งข้อมูลอย่างถูกต้องและรับข้อมูลอย่างถูกต้อง และการสื่อสารแบบอนุกรมสำเร็จ