|
7#
楼主 |
发表于 2008-12-5 13:13:45
|
只看该作者
常数 值 描述
comEvSend 1 在传输缓冲区中有比 Sthreshold 数少的字符。
comEvReceive 2 收到 Rthreshold 个字符。该事件将持续产生直到用 Input 属性从接收缓冲区中删除数据。
comEvCTS 3 Clear To Send 线的状态发生变化。
comEvDSR 4 Data Set Ready 线的状态发生变化。该事件只在 DST 从 1 变到 0 时才发生。
comEvCD 5 Carrier Detect 线的状态发生变化。
comEvRing 6 检测到振铃信号。一些 UART(通用异步接收— 传输)可能不支持该事件。
comEvEOF 7 收到文件结束(ASCII 字符为 26)字符。
数据类型
Integer
MSComm 控件示例
下面这个简单的例子演示了用调制解调器进行基本的串行通讯:
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 命令送到调制解调器。
' Chr$函数:返回 String,其中包含有与指定的字符代码相关的字符 。
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 控件可以采用轮询或事件驱动的方法从端口获取数据。这个简单的例子使用了轮询方法。
实例1:计算机拨号
在一些实际应用中经常需要使用计算机拨号。下面这个例子利用MSComm控件操作Modem进行拨号,实现串口通信。
实现步骤:
1.建窗体
添加一个MSComm控件,用来建立与串口的连接;
添加一个Text控件,Name属性为Txttel,用来输入电话号码;
添加3个CommandButton控件,Name属性分别为DialButton、CancellButton、QuitButton,分别用来实现拨号、中止拨号、中止程序;
添加一个Label控件,用来显示所有与拨号有关的信息。窗体见图1。
2.设置MSComm控件属性
InBufferSize=1024; ’ InBufferSize 是指整个接收缓冲区的大小。缺省值是 1024 字节。
Inputlen=0; ’ InputLen 属性的缺省值是 0。设置 InputLen 为 0 时,使用 Input 将使 MSComm 控件读取接收缓冲区中全部的内容。
InputMode=0; ’0---(缺省)数据通过 Input 属性以文本形式取回。
1--数据通过 Input 属性以二进制形式取回
Rthreshold=2; ’ 当接收字符后,若 Rthreshold 属性设置为 0(缺省值)则不产生 OnComm 事件。
RTSEnable=True; ’ 当 RTSEnable 设置为 True,端口打开时,Request To Send 线设置为高电平,端口关闭时,设置为低电平。
Settings=“9600,N,8,1”;
Sthreshold=0。 ’ 若设置 Sthreshold 属性为 0(缺省值),数据传输事件不会产生 OnComm 事件。若设置 Sthreshold 属性为 1,当传输缓冲区完全空时,MSComm 控件产生 OnComm 事件。
因为每一台计算机的串口使用状态都不会一样。为使程序具有通用性,在窗体的Load方法中首先进行串口测试,找到第一个可用串口后再进行设置。
3.程序功能
程序根据输入的电话号码进行拨号,Modem正常拨号后,提示用户摘机,准备通话。
图1 电话拨号实例
4.主要方法与事件代码
'设置可用串口
Private Sub Form_Load()
On Error GoTo error_open
For i = 1 To 4
MSComm1.CommPort = 1
MSComm1.PortOpen = True
'设置可用的第一个串口
On Error GoTo 0
Exit Sub
error_resume:
Next
error_open:
Resume error_resume
End Sub
Private Sub DialButton_Click()
Dim Number$, Temp$
Number$ = Trim$(Txttel.Text) ’ 返回 Variant (String),其中包含指定字符串的拷贝,没有前导空白 (LTrim)、尾随空白 (RTrim) 或前导和尾随空白 (Trim)。
If Number$ = “" Then
MsgBox “请输入电话号码"
Txttel.SetFocus
Exit Sub
End If
DialButton.Enabled = False
QuitButton.Enabled = False
DialString$ =“ATDT”+ Number$ + “;” + vbCr
'清除接收缓冲区
MSComm1.InBufferCount =0
'拨电话号码
MSComm1.Output = DialString$
Lblmessage.Caption = “正在拨号码 -”+Number$
DialButton.Enabled = True
QuitButton.Enabled = True
End Sub
Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvReceive
'读取串口数据
COMBUF=COMBUF + MSComm1.Input
lc = InStr(1, COMBUF, “OK”)
If lc = 0 Then Exit Sub
'Modem已正常拨号,返回OK
Lblmessage.Caption = “请您摘下电话机, 准备通话”
Case comEvSend
End Select
End Sub
Private Sub CancelButton_Click()
'断开与调制解调器的连接
MSComm1.Output = “ATH” + vbCr
End Sub
实例2:实现来电显示
在一些实际应用中,需要显示并保存来电号码,并根据电话号码显示相应资料,比如小区物业管理和110报警等系统。
实现步骤:
1.创建窗体
添加一个MSComm控件,用来建立与串口的连接;
添加4个Option控件,用来确定使用的串口号;
添加4个Label控件,用来显示来电号码及日期时间;
添加一个ProgressBar控件,用来显示电话振铃次数;
为方便调试程序,添加一个Text控件Text 5,用来显示Modem传来的所有信息。窗体见图2。
图2 来电显示窗体
2.设置MSComm控件属性
InBufferSize=1024;
Inputlen=0;
InputMode=0;
Rthreshold=1;
RTSEnable=True;
Settings=“9600,N,8,1";
Sthreshold=0。 |
|