圆圆教做菜 發表於 2007-3-8 00:00:00

关于MSCOMM控件的一些说明第1/2页

关于MSCOMM控件的一些说明 <BR>&nbsp;&nbsp;&nbsp;VB5.0/6.的MSComm通信控件提供了一系列标准通信命令的接口,它允许建立串口连接,可以连接到其他通信设备(如Modem). <BR>还可以发送命令、进行数据交换以及监视和响应在通信过程中可能发生的各种错误和事件,从而可以用它创建全双工&nbsp;、事件驱 <BR>动的、高效实用的通信程序。但在实际通信软件设计过程中,MSComm控件并非像想像中那样完美和容易控制.特别是在中文Wln <BR>&nbsp;95/98下通信时更会出现问题。下面就从基础开始介绍,然后逐步讨沦MSComm控件在编程中出现的问题以及编程技巧。 <BR>一、用MSComm控件通信 <BR>1.串口通信基础知识 <BR>&nbsp;&nbsp;&nbsp;&nbsp;一般悦来,计算机都有一个或多个串行端口,它们依次为com1、Com2、…,这些串口还提供了外部设备与pC进行数据传输和 <BR>皿信的通道。这些串口在CPU和外设之间充当解释器的角色。当字符数据从CPU发送给外设时,这些字符数据将被转换成串行比特 <BR>流数据;当接收数据时,比特流数据被转换为字符数据传递给CPU,再进一步说,在操作系统方面,Windows用通信驱动程序 <BR>(COMM.DRV)调用API函数发送和接收数据,当用通信控件或声明调用API函数时,它门由COMM.&nbsp;DRV解释并传递给设备驱动程序, <BR>作为一个vB程序员,要编写通信程序.只需知道通信控件提供给Windows通信AP1函数的接口即可.换句话说,只需设定和监视通 <BR>信控件的属性和事件即可。 <BR>2.使用Mscomm控件 <BR>在开始使用MSComm控件之前。需要先了解其属性、事件或错误 <BR>属性&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;描述 <BR>CommPort&nbsp;&nbsp;&nbsp;&nbsp;设置或返回通信端口号 <BR>Settings&nbsp;&nbsp;&nbsp;&nbsp;以字符串的形式设置或返回波特率、奇偶校验、数据位和停止位 <BR>PortOpen&nbsp;&nbsp;&nbsp;&nbsp;设置或返回通信端口的状态。也可以打开和关闭端口 <BR>Input&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;返回和删除接收缓冲区中的字符 <BR>Output&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将字符串写入发送缓冲区 <br><br>CommEvent属性为通信事件或错误返回下列值之一。在该控件的对象库中也可以找到这些常量。 <BR>常量&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;值&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;描述 <BR>ComEventBreak&nbsp;&nbsp;&nbsp;1001&nbsp;&nbsp;&nbsp;&nbsp;收到了断开信号 <BR>ComEventCTSTO&nbsp;&nbsp;&nbsp;1002&nbsp;&nbsp;&nbsp;&nbsp;Clear&nbsp;To&nbsp;Send&nbsp;Timeout。在发送字符时,在系统指定的事1件内,CTS(Clear&nbsp;To&nbsp;Send)线是低电平 <BR>ComEventDSRTO&nbsp;&nbsp;&nbsp;1003&nbsp;&nbsp;&nbsp;&nbsp;Data&nbsp;Set&nbsp;Ready&nbsp;Timeout。在发送字符时,在系统指定的事件内,DSR(Data&nbsp;Set&nbsp;Ready)线是低电平 <BR>ComEventFrame&nbsp;&nbsp;&nbsp;1004&nbsp;&nbsp;&nbsp;&nbsp;数据帧错误。硬件检测到一个数据帧错误 <BR>ComEventOverrun&nbsp;1006&nbsp;&nbsp;&nbsp;&nbsp;端口溢出。硬件中的字符尚未读,下一个字符又到达,并且丢失 <BR>ComEventCDTO&nbsp;&nbsp;&nbsp;&nbsp;1007&nbsp;&nbsp;&nbsp;&nbsp;Carrier&nbsp;Detect&nbsp;Time。在发送字符时,在系统指定的事件内,CD(Carrier&nbsp;Detect)线是低电平。CD <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;也称为RLSD(Receive&nbsp;Line&nbsp;Singal&nbsp;Detect,接收线信号检测) <BR>ComEventRxOver&nbsp;&nbsp;1008&nbsp;&nbsp;&nbsp;&nbsp;接收缓冲区溢出。在接收缓冲区中没有空间 <BR>ComEventRxParity&nbsp;1009&nbsp;&nbsp;&nbsp;奇偶校验错。硬件检测到奇偶校验错误7 <BR>ComEventTxFull&nbsp;&nbsp;1010&nbsp;&nbsp;&nbsp;&nbsp;发送缓冲区满。在对发送字符排队时,发送缓冲区满 <BR>ComEventDCB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1011&nbsp;&nbsp;&nbsp;&nbsp;检取端口DCB(Device&nbsp;Control&nbsp;Blick)时发生了没有预料到的错误 <br><br>通信事件包含了下面的设置: <BR>&nbsp;常量&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;值&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;描述 <BR>ComEvSend&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;发送缓冲区中的字符数比Sthreshold值低 <BR>ComEvReceive&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;接收到了Rthreshold个字符。持续产生该事件,直到使用了Input属性删除了接收缓冲区中的数据 <BR>ComEvCTS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;CTS(Clear&nbsp;To&nbsp;Send)线改变 <BR>ComEvDSR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;DSR(Data&nbsp;Set&nbsp;Ready)线改变。当DSR从1到0改变时,该事件发生 <BR>ComEvCD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;CD(Carrier&nbsp;Detect)线改变ComEvRing6检测到响铃信号。一些URAT(Universal&nbsp;AsynchronousReciver- <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-Transmitters,通用异步收发器)不支持该事件 <BR>ComEvEOF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7&nbsp;&nbsp;&nbsp;&nbsp;收到了EOF字符(ASCII字符26) <br><br>Error消息(MSComm控件)下表列出了MSComm控件可捕获的错误消息: <BR>常量&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;值&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;描述 <BR>ComInvalidPropertyValue&nbsp;&nbsp;&nbsp;&nbsp;380&nbsp;&nbsp;&nbsp;无效的属性值 <BR>ComSetNotSupported&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;383&nbsp;&nbsp;&nbsp;属性只读 <BR>ComGetNotSupported&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;394&nbsp;&nbsp;&nbsp;属性只读 <BR>ComPortOpen&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8000&nbsp;&nbsp;&nbsp;端口打开时该存在无效 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8001&nbsp;&nbsp;&nbsp;超时设置必须比0值大 <BR>ComPortInvalid&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8002&nbsp;&nbsp;&nbsp;无效的端口号 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8003&nbsp;&nbsp;&nbsp;属性只在运行时有效 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8004&nbsp;&nbsp;&nbsp;属性在运行时是只读的 <BR>ComPortAleadyOpen&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8005&nbsp;&nbsp;&nbsp;端口已经打开 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8006&nbsp;&nbsp;&nbsp;设备标识符无效或不支持 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8007&nbsp;&nbsp;&nbsp;不支持设备的波特率 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8008&nbsp;&nbsp;&nbsp;指定的字节大小无效 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8009&nbsp;&nbsp;&nbsp;缺省参数错误 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8010&nbsp;&nbsp;&nbsp;硬件不可用(被其他设备锁住) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8011&nbsp;&nbsp;&nbsp;函数不能分配队列 <BR>ComNoOpen&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8012&nbsp;&nbsp;&nbsp;设备没有打开 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8013&nbsp;&nbsp;&nbsp;设备已经打开 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8014&nbsp;&nbsp;&nbsp;不能使用通信通知 <BR>ComSetCommStateFailed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8015&nbsp;&nbsp;&nbsp;不能设置通信状态 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8016&nbsp;&nbsp;&nbsp;不能设置通信事件屏蔽 <BR>ComPortNotOpen&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8018&nbsp;&nbsp;&nbsp;该存在只在端口打开是有效 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8019&nbsp;&nbsp;&nbsp;设备忙 <BR>ComReadError&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8020&nbsp;&nbsp;&nbsp;通信设备读错误 <BR>ComDCBError&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8021&nbsp;&nbsp;&nbsp;检取端口设备控制块时出现内部错误 <br><br>搞清楚以上基本属性后,就可以开始编写通信许程序了。在VB5.0/6.0中新建一个工程文件。添加Microsoft&nbsp;Comm&nbsp;Control&nbsp;5.0组 <BR>件,在简体Form1中加入Command命令按钮并取名为CmdTest,MSComm控件取名为MSComm1,加入如下程序代码。 <BR>Private&nbsp;Sub&nbsp;cmdTestClick&nbsp;(&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'打开串口 <BR>MSComml.CommPort&nbsp;=2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'设定Com2 <BR>If&nbsp;MSComml.PortOpen&nbsp;=&nbsp;False&nbsp;Then <BR>MSComm1.Settings&nbsp;=&nbsp;"9600,n,8,1"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'9600波特率,无校验,8位数据位,1位停止位 <BR>MSComm1.PortOpen&nbsp;=&nbsp;True&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'打开串口 <BR>End&nbsp;if <BR>MSComm1.OutBufferCount&nbsp;=&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'清空发送缓冲区 <BR>MSComm1.InBufferCount&nbsp;=&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'滑空接收缓冲区 <br><br>'发送字符数据时注意必须用回车符(vbcr)结束 <BR>MSComm1.Output="This&nbsp;is&nbsp;a&nbsp;qood&nbsp;book&nbsp;!&nbsp;"&nbsp;&amp;vbCr <br><br>'泼打电话号码或发送AT命令 <BR>MSComm1.Output&nbsp;=&nbsp;"ATDT&nbsp;05778191898&nbsp;,&nbsp;&amp;&nbsp;vbCr <br><br>'发送字符数组数据时注意ByteArray必须事先定义赋值 <BR>Dim&nbsp;ByteArray&nbsp;as&nbsp;byte(&nbsp;) <br><br>'定义动态数组 <BR>ReDim&nbsp;ByteArray(1) <br><br>'重定义数组大小 <BR>ByteArray&nbsp;(&nbsp;0&nbsp;)&nbsp;=0 <BR>ByteArray&nbsp;(&nbsp;1&nbsp;)&nbsp;=&nbsp;1 <BR>MSComm1.Output&nbsp;=&nbsp;ByteArray <BR>End&nbsp;Sub <br><br>private&nbsp;Sub&nbsp;MScommEvent(&nbsp;) <BR>Select&nbsp;Case&nbsp;MSComm1.CommEvent <BR>Case&nbsp;comEvReceive <BR>Dim&nbsp;Buffer&nbsp;As&nbsp;Variant <BR>MSComm1.InputLen&nbsp;=&nbsp;0 <BR>'接收二进制数据 <BR>MSComm1.InputMode=&nbsp;ComInputModeBinary <BR>Buffer=MSComm1.Input <BR>'接收字符数据 <BR>MSComm1.InputMode=comInputModeText <BR>Buffer&nbsp;=&nbsp;MSComml.Input <BR>Case&nbsp;else <BR>End&nbsp;Select <BR>End&nbsp;sub&nbsp; <BR>(&nbsp;程序1) <BR>
                            <div class="pagenum tc"><strong>1</strong>2下一页阅读全文</div>
                            <div class="art_xg">
                              
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: 关于MSCOMM控件的一些说明第1/2页