หมายเหตุบางประการเกี่ยวกับตัวควบคุม MSCOMM
การควบคุมการสื่อสาร MSComm ของ VB5.0/6 มีชุดอินเทอร์เฟซคำสั่งการสื่อสารมาตรฐาน ซึ่งช่วยให้สามารถสร้างการเชื่อมต่อพอร์ตอนุกรมและสามารถเชื่อมต่อกับอุปกรณ์สื่อสารอื่นๆ (เช่น โมเด็ม)
คุณยังสามารถส่งคำสั่ง แลกเปลี่ยนข้อมูล ตรวจสอบและตอบสนองต่อข้อผิดพลาดและเหตุการณ์ต่างๆ ที่อาจเกิดขึ้นระหว่างกระบวนการสื่อสาร ช่วยให้คุณสร้างฟูลดูเพล็กซ์ที่ขับเคลื่อนด้วยเหตุการณ์
โปรแกรมการสื่อสารแบบไดนามิก มีประสิทธิภาพ และใช้งานได้จริง อย่างไรก็ตาม ในกระบวนการออกแบบซอฟต์แวร์การสื่อสารจริง การควบคุม MSComm ไม่ได้สมบูรณ์แบบและควบคุมได้ง่ายอย่างที่คิด โดยเฉพาะภาษาจีน Wln
จะมีปัญหามากขึ้นในการสื่อสารภายใต้ 95/98 ต่อไปนี้จะเริ่มต้นด้วยการแนะนำขั้นพื้นฐาน จากนั้นค่อย ๆ หารือเกี่ยวกับปัญหาที่เกิดขึ้นในการเขียนโปรแกรมของตัวควบคุม MSComm และเทคนิคการเขียนโปรแกรม
1. สื่อสารกับการควบคุม MSComm
1. ความรู้พื้นฐานเกี่ยวกับการสื่อสารแบบอนุกรม
โดยทั่วไป คอมพิวเตอร์จะมีพอร์ตอนุกรมตั้งแต่หนึ่งพอร์ตขึ้นไป ซึ่งได้แก่ com1, com2,... พอร์ตอนุกรมเหล่านี้ยังจัดเตรียมอุปกรณ์ภายนอกและพีซีสำหรับการส่งข้อมูลและ
เนื้อเรื่องของจดหมาย พอร์ตอนุกรมเหล่านี้ทำหน้าที่เป็นล่ามระหว่าง CPU และอุปกรณ์ต่อพ่วง เมื่อข้อมูลอักขระถูกส่งจาก CPU ไปยังอุปกรณ์ต่อพ่วง ข้อมูลอักขระเหล่านี้จะถูกแปลงเป็นบิตอนุกรม
ข้อมูลสตรีม เมื่อรับข้อมูล ข้อมูลสตรีมบิตจะถูกแปลงเป็นข้อมูลตัวอักษรและส่งผ่านไปยัง CPU นอกจากนี้ ในแง่ของระบบปฏิบัติการ Windows ยังใช้ไดรเวอร์การสื่อสาร
(COMM.DRV) เรียกใช้ฟังก์ชัน API เพื่อส่งและรับข้อมูล เมื่อฟังก์ชัน API ถูกเรียกใช้ด้วยการควบคุมการสื่อสารหรือการประกาศ ฟังก์ชันเหล่านี้จะถูกตีความโดย COMM.DRV และส่งผ่านไปยังไดรเวอร์อุปกรณ์
ในฐานะโปรแกรมเมอร์ vB คุณต้องเขียนโปรแกรมสื่อสาร คุณจะต้องทราบอินเทอร์เฟซที่ได้รับจากการควบคุมการสื่อสารไปยังฟังก์ชันการสื่อสาร Windows AP1 เท่านั้น กล่าวอีกนัยหนึ่ง เพียงแค่ตั้งค่าและติดตาม
เพียงเชื่อถือคุณสมบัติและเหตุการณ์ของตัวควบคุม
2. การใช้การควบคุม Mscomm
ก่อนเริ่มใช้งาน MSComm control ต้องทำความเข้าใจคุณสมบัติ เหตุการณ์ หรือข้อผิดพลาดก่อน
คำอธิบายคุณสมบัติ
CommPort ตั้งค่าหรือส่งคืนหมายเลขพอร์ตการสื่อสาร
การตั้งค่าจะกำหนดหรือส่งคืนอัตรารับส่งข้อมูล ความเท่าเทียมกัน บิตข้อมูล และบิตหยุดเป็นสตริง
PortOpen ตั้งค่าหรือส่งคืนสถานะของพอร์ตการสื่อสาร พอร์ตยังสามารถเปิดและปิดได้
ส่งคืนและลบอักขระในบัฟเฟอร์รับ
เอาต์พุตเขียนสตริงลงในบัฟเฟอร์การส่ง
คุณสมบัติ CommEvent ส่งกลับค่าใดค่าหนึ่งต่อไปนี้สำหรับเหตุการณ์การสื่อสารหรือข้อผิดพลาด ค่าคงที่เหล่านี้ยังสามารถพบได้ในไลบรารีวัตถุของตัวควบคุม
คำอธิบายค่าคงที่
ComEventBreak1001 ได้รับสัญญาณการหยุดทำงาน
ComEventCTSTO1002ClearToSendหมดเวลา เมื่อส่งตัวอักษรภายในเหตุการณ์ที่ระบบกำหนด บรรทัด CTS (ClearToSend) อยู่ในระดับต่ำ
ComEventDSRTO1003DataSetReadyTimeout เมื่อส่งอักขระ ภายในเหตุการณ์ที่ระบบระบุ บรรทัด DSR (DataSetReady) อยู่ในระดับต่ำ
ข้อผิดพลาดเฟรมข้อมูล ComEventFrame1004 ฮาร์ดแวร์ตรวจพบข้อผิดพลาดของเฟรมข้อมูล
พอร์ต ComEventOverrun1006 ล้น ยังไม่ได้อ่านตัวละครในฮาร์ดแวร์ ตัวละครตัวถัดไปมาถึงและสูญหายไป
ComEventCDTO1007CarrierDetectTime เมื่อส่งอักขระ บรรทัด CD (CarrierDetect) อยู่ในระดับต่ำภายในเหตุการณ์ที่ระบบระบุ ซีดี
เรียกอีกอย่างว่า RLSD (ReceiveLineSingalDetect รับการตรวจจับสัญญาณสาย)
ComEventRxOver1008 ได้รับบัฟเฟอร์ล้น ไม่มีที่ว่างในบัฟเฟอร์การรับ
ข้อผิดพลาดของพาริตี ComEventRxParity1009 ฮาร์ดแวร์ตรวจพบข้อผิดพลาดของพาริตี 7
ComEventTxFull1010 บัฟเฟอร์การส่งเต็ม ขณะรอคิวส่งอักขระ บัฟเฟอร์การส่งจะเต็ม
ComEventDCB1011 เกิดข้อผิดพลาดที่ไม่คาดคิดเมื่อเรียกข้อมูลพอร์ต DCB (DeviceControlBlick)
เหตุการณ์การสื่อสารประกอบด้วยการตั้งค่าต่อไปนี้:
คำอธิบายค่าคงที่
จำนวนอักขระในบัฟเฟอร์การส่ง ComEvSend1 ต่ำกว่าค่า Sthreshold
ComEvReceive2 ได้รับอักขระ Rthreshold เหตุการณ์นี้ยังคงถูกสร้างขึ้นจนกว่าข้อมูลในบัฟเฟอร์การรับจะถูกลบโดยใช้คุณสมบัติอินพุต
บรรทัด ComEvCTS3CTS(ClearToSend) เปลี่ยนไป
บรรทัด ComEvDSR4DSR (DataSetReady) เปลี่ยนไป เหตุการณ์นี้เกิดขึ้นเมื่อ DSR เปลี่ยนจาก 1 เป็น 0
บรรทัด ComEvCD5CD (CarrierDetect) จะเปลี่ยนไปเมื่อ ComEvRing6 ตรวจพบสัญญาณวงแหวน URAT บางตัว (UniversalAsynchronousReciver-
-ตัวส่งสัญญาณ Universal Asynchronous Receiver-Transmitter) ไม่รองรับเหตุการณ์นี้
ComEvEOF7 ได้รับอักขระ EOF (อักขระ ASCII 26)
ข้อความแสดงข้อผิดพลาด (ตัวควบคุม MSComm) ตารางต่อไปนี้แสดงรายการข้อความแสดงข้อผิดพลาดที่ตัวควบคุม MSComm สามารถจับภาพได้:
คำอธิบายค่าคงที่
ComInvalidPropertyValue380 ค่าคุณสมบัติไม่ถูกต้อง
คุณสมบัติ ComSetNotSupported383 แบบอ่านอย่างเดียว
คุณสมบัติ ComGetNotSupported394 แบบอ่านอย่างเดียว
การแสดงตนนี้ไม่ถูกต้องเมื่อมีการเปิดพอร์ต ComPortOpen8000
การตั้งค่าการหมดเวลา 8001 ต้องมากกว่า 0
ComPortInvalid8002 หมายเลขพอร์ตไม่ถูกต้อง
คุณลักษณะ 8003 ใช้ได้เฉพาะตอนรันไทม์เท่านั้น
คุณสมบัติ 8004 เป็นแบบอ่านอย่างเดียวในขณะรันไทม์
พอร์ต ComPortAleadyOpen8005 ถูกเปิดแล้ว
ตัวระบุอุปกรณ์ 8006 ไม่ถูกต้องหรือไม่ได้รับการสนับสนุน
8007 ไม่รองรับอัตรารับส่งข้อมูลของอุปกรณ์
8008 ขนาดไบต์ที่ระบุไม่ถูกต้อง
8009 ข้อผิดพลาดของพารามิเตอร์เริ่มต้น
8010 ฮาร์ดแวร์ไม่พร้อมใช้งาน (ล็อคโดยอุปกรณ์อื่น)
ฟังก์ชัน 8011 ไม่สามารถจัดสรรคิวได้
อุปกรณ์ ComNoOpen8012 ไม่ได้เปิดอยู่
8013 อุปกรณ์เปิดอยู่แล้ว
8014 การแจ้งเตือนการสื่อสารไม่สามารถใช้งานได้
ComSetCommStateFailed8015 ไม่สามารถตั้งค่าสถานะการสื่อสารได้
8016 ไม่สามารถตั้งค่าการป้องกันเหตุการณ์การสื่อสารได้
ComPortNotOpen8018 การแสดงตนนี้จะใช้ได้เฉพาะเมื่อพอร์ตเปิดอยู่เท่านั้น
8019 อุปกรณ์ไม่ว่าง
ComReadError8020 ข้อผิดพลาดในการอ่านอุปกรณ์สื่อสาร
ComDCBError8021 เกิดข้อผิดพลาดภายในขณะดึงข้อมูลบล็อกควบคุมอุปกรณ์พอร์ต
หลังจากทำความเข้าใจคุณสมบัติพื้นฐานข้างต้นแล้ว คุณก็สามารถเริ่มเขียนโปรแกรมอนุญาตการสื่อสารได้ สร้างไฟล์โครงการใหม่ใน VB5.0/6.0 เพิ่มกลุ่ม MicrosoftCommControl5.0
ไฟล์ เพิ่มปุ่ม Command ลงใน Form1 อย่างง่าย และตั้งชื่อเป็น CmdTest ตั้งชื่อตัวควบคุม MSComm MSComm1 และเพิ่มโค้ดโปรแกรมต่อไปนี้
PrivateSubcmdTestClick()'เปิดพอร์ตอนุกรม
MSComml.CommPort=2'ตั้งค่า Com2
IfMSComml.PortOpen=Falseแล้ว
MSComm1.Settings="9600,n,8,1"'9600 อัตรารับส่งข้อมูล, ไม่มีพาริตี, 8 บิตข้อมูล, 1 บิตหยุด
MSComm1.PortOpen=True'เปิดพอร์ตอนุกรม
เอนดิฟ
MSComm1.OutBufferCount=0'ล้างบัฟเฟอร์การส่ง
MSComm1.InBufferCount=0'สลิปบัฟเฟอร์การรับ
'เมื่อส่งข้อมูลตัวอักษร ต้องแน่ใจว่าได้ลงท้ายด้วยการขึ้นบรรทัดใหม่ (vbcr)
MSComm1.Output="Thisisaqoodbook!"&vbCr
'สาดหมายเลขโทรศัพท์หรือส่งคำสั่ง AT'
MSComm1.Output="ATDT05778191898,&vbCr
'เมื่อส่งข้อมูลอาร์เรย์อักขระ โปรดทราบว่า ByteArray จะต้องกำหนดค่าล่วงหน้า
DimByteArrayasbyte()
'กำหนดอาร์เรย์แบบไดนามิก
ReDimByteArray(1)
'กำหนดขนาดอาร์เรย์ใหม่
ไบต์อาร์เรย์(0)=0
ไบต์อาร์เรย์(1)=1
MSComm1.Output=ByteArray
สิ้นสุดย่อย
privateSubMScommEvent ()
SelectCaseMSComm1.CommEvent
CasecomEvReceive
DimBufferAsVariant
MSComm1.InputLen=0
'รับข้อมูลไบนารี่'
MSComm1.InputMode=ComInputModeBinary
บัฟเฟอร์=MSComm1.อินพุต
'รับข้อมูลตัวละคร'
MSComm1.InputMode=comInputModeText
บัฟเฟอร์=MSComml.อินพุต
คาเซลเซ่
สิ้นสุดการเลือก
จบซับ
(ขั้นตอนที่ 1)
1 2อ่านข้อความฉบับเต็มในหน้าถัดไป