MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。
MSComm 控件提供下列两种处理通讯的方式:
- 事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。在许多情况下,在事件发生时需要得到通知,例如,在 Carrier Detect (CD) 或 Request To Send (RTS) 线上一个字符到达或一个变化发生时。在这些情况下,可以利用 MSComm 控件的 OnComm 事件捕获并处理这些通讯事件。OnComm 事件还可以检查和处理通讯错误。所有通讯事件和通讯错误的列表,参阅 CommEvent 属性。
- 在程序的每个关键功能之后,可以通过检查 CommEvent 属性的值来查询事件和错误。如果应用程序较小,并且是自保持的,这种方法可能是更可取的。例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“确定”响应。
每个使用的 MSComm 控件对应着一个串行端口。如果应用程序需要访问多个串行端口,必须使用多个 MSComm 控件。可以在 Windows“控制面板”中改变端口地址和中断地址。
尽管 MSComm 控件有很多重要的属性,但首先必须熟悉几个属性。
属性 | 描述 |
CommPort | 设置并返回通讯端口号。 |
Settings | 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。 |
PortOpen | 设置并返回通讯端口的状态。也可以打开和关闭端口。 |
Input | 从接收缓冲区返回和删除字符。 |
Output | 向传输缓冲区写一个字符串。 |
下面这个简单的例子演示了用调制解调器进行基本的串行通讯:
Private Sub Form_Load () '
保存输入子串的缓冲区Dim Instring As String
'
使用COM1
。MSComm1.CommPort = 1
' 9600
波特,无奇偶校验,8
位数据,一个停止位。MSComm1.Settings = "9600,N,8,1"
'
当输入占用时,'
告诉控件读入整个缓冲区。MSComm1.InputLen = 0
'
打开端口。MSComm1.PortOpen = True
'
将attention
命令送到调制解调器。MSComm1.Output = "ATV1Q0" & Chr$(13) '
确保'
调制解调器以"OK"
响应。'
等待数据返回到串行端口。Do
DoEvents
Buffer$ = Buffer$ & MSComm1.Input
Loop Until InStr(Buffer$, "OK" & vbCRLF)
'
从串行端口读"OK"
响应。'
关闭串行端口。MSComm1.PortOpen = False
End Sub
注意 MSComm 控件可以采用轮询或事件驱动的方法从端口获取数据。这个简单的例子使用了轮询方法。关于事件驱动方法的例子请参阅 OnComm 事件的帮助。
OnComm 事件
无论何时当 CommEvent 属性的值变化时,就产生 OnComm 事件,标志发生了一个通讯事件或一个错误。
语法
Private Sub object_OnComm ()
OnComm 事件语法包括下列部分:
部分 | 描述 |
object | 对象表达式,其值是“应用于”列表中的对象。 |
说明
CommEvent 属性包含实际错误或产生 OnComm 事件的事件号。注意,设置 Rthreshold 或 Sthreshold 属性为 0,分别使捕获 comEvReceive 和 comEvSend 事件无效。
OnComm 事件示例
下例说明如何处理通讯错误和事件。可以在相关的 Case 语句之后插入代码来处理特定的错误或事件。
Private Sub MSComm_OnComm () Select Case MSComm1.CommEvent ' Handle each event or error by placing ' code below each case statement '
错误Case comEventBreak '
收到Break
。Case comEventCDTO ' CD (RLSD)
超时。Case comEventCTSTO ' CTS Timeout
。Case comEventDSRTO ' DSR Timeout
。Case comEventFrame ' Framing Error
Case comEventOverrun '
数据丢失。Case comEventRxOver'
接收缓冲区溢出。Case comEventRxParity' Parity
错误。Case comEventTxFull '
传输缓冲区已满。Case comEventDCB '
获取DCB]
时意外错误'
事件Case comEvCD ' CD
线状态变化。Case comEvCTS ' CTS
线状态变化。Case comEvDSR ' DSR
线状态变化。Case comEvRing ' Ring Indicator
变化。Case comEvReceive '
收到RThreshold # of chars.
Case comEvSend '
传输缓冲区有Sthreshold
个字符' '
Case comEvEof '
输入数据流中发现EOF
字符'
End Select
End Sub