MSComm 控件为应用程序提供了串口通信功能,该应用程序允许通过串口发送和接收数据。 语法 MSComm 说明 MSComm控件提供了两种处理通信的方法: · 事件驱动通信,是一种功能很强的处理串口活动的方法。在大多数情况下,用户需要获知事件发生的时间, 例如,在CD(Carrier Detect)线或RTS(Request To Send)线上有字符到达或发生了改变等。在这种情况下 ,使用MSComm 控件的OnComm 事件捕获和处理这些通信事件。OnComm也可以捕获和处理通信中的错误。要获取 所有事件和通信错误的完整清单,请参阅CommEvent属性。 · 用户也可以在每个重要的程序功能之后检查CommEvent 属性的值来检测事件和通信错误。这对小的自含程序 可能比较常用。例如,如果编写一个简单的电话拨号程序,那么在接收了每个字符后都产生一个事件并没有 意义,因为你只打算从调制解调器中接收OK响应信息。 使用的每个MSComm 控件都与一个串口对应。如果在应用程序中需要访问多个串口,必须使用多个MSComm 控件 。可以在Windows 控制面板中修改串口地址的中断地址。 虽然MSComm控件有许多很重要的属性,但应先熟悉下面几个属性: 属性描述 CommPort 设置或返回通信端口号 Settings 以字符串的形式设置或返回波特率、奇偶校验、数据位和停止位 PortOpen 设置或返回通信端口的状态。也可以打开和关闭端口 Input 返回和删除接收缓冲区中的字符 Output 将字符串写入发送缓冲区 示例 下面的例子演示了使用调制解调器进行基本的通信。 Private Sub Form_Load () Buffer to hold input string Dim Instring As String Use COM1. MSComm1.CommPort = 1 9600 baud no parity 8 data and 1 stop bit. MSComm1.Settings = "9600N81" Tell the control to read entire buffer when Input is used. MSComm1.InputLen = 0 Open the port. MSComm1.PortOpen = True Send the attention command to the modem. MSComm1.Output = "ATVtQ0"& + Chr$(13) Ensure that the modem responds with “OK” Wait for data to come back to the serial port. Do DoEvents Buffer$ = Buffer$ MSComm1.Input Loop Until InStr (Buffer$ “OK” & vbCRLF) Read the "OK" response data in the serial port. Close the serial port. MSComm1.PortOpen = False End Sub 注意:MSComm 控件可以使用查询或事件驱动的方法从串口接收数据。本例使用了查询的方法。对于事件驱动方 法的例子,请参阅OnComm 事件的帮助。 Break属性 设置或清除断开信号状态。在设计时该属性不可用。 语法 object.Break [=value] Break属性的语法有如下几个部分: 部分描述 object 对象表达式,其值是“应用于”列表中的一个对象 value 一个布尔表达式,指明是否设置断开信号状态,如“设置”中所示 设置 vlaue 值的设置如下: 设置描述 True 设置断开信号状态 False 清除断开信号状态 说明 当设置为True 时,Break 属性就发送一个断开信号。断开信号将停止字符发送,将发送线置为断开状态,直到 将Break属性置为False。 通常,为短时间区以及只有当用于通信的设备需要设置断开状态时才设置断开状态。 数据类型 Boolean。 示例 下面的例子演示了如何发送十分之一秒的断开信号。 Set the Break condition. MSComm1.Break = True Set duration to 1/10 second. Duration! = Timer + .1 Wait for the duration to pass. Do Until Timer Duration! Dummy = DoEvents() Loop Clear the Break condition. MSComm1.Break = False CDHolding属性 通过检查CD 线的状态来查询是否有载波。CD(Carrier Detect,载波检测)是调制解调器发送给连接计算机的 指示调制解调器在线的信号。该属性在设计时不可用,在运行时是只读的。 语法 object.CDHolding CDHolding属性的语法有如下几个部分: 部分描述 object 对象表达式,其值是“应用于”列表中的一个对象 设置 CDHolding属性的设置如下: 设置描述 True CD线高 False CD线低 说明 当CD线高(CDHolding = True)并超时,MSComm控件就将CommEvent属性设置为commEventCDTO(Carrier Detect Timeout Error),并产生一个OnComm事件。CD也称为RLSD(Receive Line Singal Detect,接收线信 号检测)。 注意:尤其要注意的是,在主机应用程序比如电子公告板中要侦测载波信号的丢失问题,因为呼叫者随时都有 可能挂起。 数据类型: Boolean。 CommEvent 属性 返回最近的通信事件或错误。该属性在设计时不可用,在运行时是只读的。 语法 object.CommEvent CommEvent属性的语法有如下几个部分: 部分描述 object 对象表达式,其值是“应用于”列表中的一个对象 说明 尽管通信事件或错误都产生OnComm 事件,但CommEvent 属性中包含了事件或错误的代码。要确定导致OnComm 事件的实际错误或事件,必须引用CommEvent属性。 CommEvent 属性为通信事件或错误返回下列值之一。在该控件的对象库中也可以找到这些常量。 通信错误包含了下面的设置: 常量值描述 ComEventBreak 1001 收到了断开信号 ComEventCTST O 1002 Clear To Send Timeout。在发送字符时,在系统指定的事件内,CTS(Clear To Send)线是低电平 ComEventDSRT O 1003 Data Set Ready Timeout。在发送字符时,在系统指定的事件内,DSR(Data Set Ready)线是低电平 ComEventFrame 1004 数据帧错误。硬件检测到一个数据帧错误 ComEventOverru n 1006 端口溢出。硬件中的字符尚未读,下一个字符又到达, 并且丢失 ComEventCDTO 1007 Carrier Detect Time。在发送字符时,在系统指定的事件内,CD(Carrier Detect)线是 低电平。CD也称为RLSD(Receive Line Singal Detect,接收线信号检测) ComEventRxOve r 1008 接收缓冲区溢出。在接收缓冲区中没有空间 ComEventRxPari ty 1009 奇偶校验错。硬件检测到奇偶校验错误 续表 ComEventTxFull 1010 发送缓冲区满。在对发送字符排队时,发送缓冲区满ComEventDCB 1011 检取端口DCB( Device Control Blick)时发生了没有预料到的错误 通信事件包含了下面的设置: 常量值描述 ComEvSend 1 发送缓冲区中的字符数比Sthreshold值低 ComEvRecei ve 2 接收到了Rthreshold 个字符。持续产生该事件,直到使用了Input属性删除了接收缓冲区中的数据 ComEvCTS 3 CTS(Clear To Send)线改变 ComEvDSR 4 DSR(Data Set Ready)线改变。当DSR 从1 到0 改变时,该事件发生 ComEvCD 5 CD(Carrier Detect)线改变 ComEvRing 6 检测到响铃信号。一些URAT(Universal Asynchronous Reciver-Transmitters通用异步收发器)不支持该事件 ComEvEOF 7 收到了EOF字符(ASCII字符26) 数据类型 Integer。 CommID属性 返回标识通信设备的句柄。该属性在设计时不可用,在运行时是只读的。 语法 object.CommID CommID属性的语法有如下几个部分: 部分描述 object 对象表达式,其值是“应用于”列表中的一个对象 说明 该值与Windows API 函数CreateFile 返回值是一样的。在Windows API 中调用任何通信例程都使用该值。 数据类型 Long CommPort属性 返回或设置通信端口号。 语法 object.CommPort [=value] CommPort属性的语法有如下几个部分: 部分描述 object 对象表达式,其值是“应用于”列表中的一个对象 value 指定端口号的整数 说明 在设计时,可以将value 置为1 到16 之间的整数(缺省为1)。然而,当试图使用PortOpen 属性打开一个不存 在的端口号时,MSComm 控件就产生68 错误(Device unavilable)。 警告:必须在打开端口前设置CommPort属性。 数据类型 Integer。 CTSHolding属性 检查CTS(Clear To Send)线的状态,确定是否可以发送数据。通常,调制解调器给连接的计算机发送CTS 信 号,指明正在处理发送过程。该属性在设计时不可用,在运行时是只读的。 语法 object.CTSHolding CTSHolding属性的语法有如下几个部分: 部分描述 object 对象表达式,其值是“应用于”列表中的一个对象 CTSHolding属性的设置如下表所示: 设置描述 True CTS(Clear To Send)线高 False CTS(Clear To Send)线低 说明 当CTS线低(CTSHolding = False)并超时,MSComm控件就设置CommEvent 属性为comEventCTSTO(Clear To Send Timout)并激活OnComm事件。 在RTS/CTS( Request To Send / Clear To Send)硬件握手中使用CTS线。如果需要确定CTS线的状态,可以使用 CTSHolding属性手动查询。 要获取更多信息或握手协议,请参阅Handshaking属性。 数据类型 Boolean DSRHolding属性 确定DSR(Data Set Ready)线的状态。通常,调制解调器给连接的计算机发送CTS信号,指明准备就绪。该属 性在设计时不可用,在运行时是只读的。 语法 object.DSRHolding object置换元表示一个对象表达式,其值为“应用于”列表中的一个对象。 DSRHolding属性返回如下值: 值描述 True DSR(DataSetReady)线高 False DSR(DataSetReady)线低 说明 当DSR线高(DSRHolding = False)并超时,MSComm控件设置CommEvent 属性为comEventDTSTO(Data Set Ready Timeout)并激活OnComm事件。 在为DTE(Data Terminal Equipment)计算机编写DSR/DTR(Data Set Ready / Data Terminal Equipment ) |