VB中关于MSComm控件使用详解
更新时间:2023-09-17 19:57:01 阅读量: 幼儿教育 文档下载
- vb中关于数组的题目推荐度:
- 相关推荐
MSComm控件使用详解
MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。MSComm控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API函数,而且在VC、VB、Delphi等语言中均可使用。 Microsoft Communications Control(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。 1.MSComm控件两种处理通讯的方式
MSComm控件提供下列两种处理通讯的方式:事件驱动方式和查询方式。
1.1 事件驱动方式
事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者 Carrier Detect (CD) 或 Request To Send (RTS) 线上一个字符到达或一个变化发生时。在这些情况下,可以利用 MSComm 控件的 OnComm 事件捕获并处理这些通讯事件。OnComm 事件还可以检查和处理通讯错误。所有通讯事件和通讯错误的列表,参阅 CommEvent 属性。在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。这种方法的优点是程序响应及时,可靠性高。每个MSComm 控件对应着一个串行端口。如果应用程序需要访问多个串行端口,必须使用多个 MSComm 控件。
1.2 查询方式
查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。在程序的每个关键功能之后,可以通过检查 CommEvent 属性的值来查询事件和错误。如果应用程序较小,并且是自保持的,这种方法可能是更可取的。例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“确定”响应。
2.MSComm 控件的常用属性
MSComm控件有很多重要的属性,但首先必须熟悉几个属性。 CommPort 设置并返回通讯端口号。
Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。 PortOpen 设置并返回通讯端口的状态。也可以打开和关闭端口。 Input 从接收缓冲区返回和删除字符。 Output 向传输缓冲区写一个字符串。 下面分别描述:
CommPort 属性
设置并返回通讯端口号。 语法
object.CommPort[ = value ]
CommPort 属性语法包括下列部分: 部分 描述
object 对象表达式,其值是“应用于”列表中的对象。 value 一整型值,说明端口号。
说明
在设计时,value 可以设置成从 1 到 16 的任何数(缺省值为 1)。但是如果用 PortOpen 属性打开一个并不存在的端口时,MSComm 控件会产生错误 68(设备无效)。 警告 必须在打开端口之前设置 CommPort 属性。 数据类型 Integer
Settings 属性
设置并返回波特率、奇偶校验、数据位、停止位参数。 语法
object.Settings[ = value]
Settings 属性语法包括下列部分: 部分 描述
object 对象表达式,其值是“应用于”列表中的对象。
value 字符串表达式,说明通讯端口的设置值,如下所述。 说明
当端口打开时,如果 value 非法,则 MSComm 控件产生错误 380(非法属性值)。 Value 由四个设置值组成,有如下的格式: \
BBBB 为波特率,P 为奇偶校验,D 为数据位数,S 为停止位数。value 的缺省值是: \
下表列出合法的波特率: 设置值 110 300 600 1200 2400
9600(缺省) 14400 19200 28800 38400 56000 128000 256000
下表说明合法的奇偶校验值。 设置值 描述 E 偶数 (Even) M 标记 (Mark) N 缺省 (Default) None
O 奇数 (Odd)
S 空格 (Space)
下表列出合法的数据位值。 设置值 4 5 6 7
8 (缺省)
下表列出合法的停止位值。
设置值 1 (缺省) 1.5 2
数据类型 String
Settings 示例
下面的例子设置控件端口通讯,波特率 9600,无奇偶校验检查,8 个数据位,1 个停止位: MSComm1.Settings = \
PortOpen 属性
设置并返回通讯端口的状态(开或关)。在设计时无效。 语法
object.PortOpen[ = value]
PortOpen 属性语法包括下列部分:
部分 描述
object 对象表达式,其值是“应用于”列表中的对象。 value 布尔表达式,说明通讯端口的状态。 设置值
value 设置值是: 设置值 描述 True 端口开 False 端口关
说明
设置 PortOpen 属性为 True 打开端口。设置为 False 关闭端口并清除接收和传输缓冲区。当应用程序终止时,MSComm 控件自动关闭串行端口。
在打开端口之前,确定 CommPort 属性设置为一个合法的端口号。如果 CommPort 属性设置为一个非法的端口号,则当打开该端口时,MSComm 控件产生错误 68(设备无效)。
另外,串行端口设备必须支持 Settings 属性当前的设置值。如果 Settings 属性包含硬件不支持的通讯设置值,那么硬件可能不会正常工作。
如果在端口打开之前,DTREnable 或 RTSEnable 属性设置为 True,当关闭端口时,该属性设置为 False。否则,DTR 和 RTS 线保持其先前的状态。 数据类型 Boolean
PortOpen 属性示例
下例以波特率 9600 打开 1 号通讯端口,没有奇偶检查,8 个数据位,1 个停止位。 MSComm1.Settings = \ MSComm1.CommPort = 1 MSComm1.PortOpen = True
Input 属性
返回并删除接收缓冲区中的数据流。该属性在设计时无效,在运行时为只读。 语法
object.Input
Input 属性语法包括下列部分: 部分 描述
object 对象表达式,其值是“应用于”列表中的对象。 说明
InputLen 属性确定被 Input 属性读取的字符数。设置 InputLen 为 0,则 Input 属性读取缓冲区中全部的内容。
InputMode 属性确定用 Input 属性读取的数据类型。如果设置 InputMode 为 comInputModeText,Input 属性通过一个 Variant 返回文本数据。如果设置 InputMode 为 comInputModeBinary,Input 属性通过一个 Variant .返回一二进制数据的数组。 数据类型 Variant
Input 属性示例
该例子说明如何从接收缓冲区读取数据。 Private Sub Command1_Click() Dim InString as String ' 读取所有可用数据。 MSComm1.InputLen = 0
' 检查数据。
If MSComm1.InBufferCount Then ' Read data.
InString = MSComm1.Input End If End Sub
Output 属性
往传输缓冲区写数据流。该属性在设计时无效,在运行时为只读。
语法
object.Output [ = value ]
Output 属性语法包括下列部分: 部分 描述
object 对象表达式,其值是“应用于”列表中的对象。 value 要写到传输缓冲区中的一个字符串。
说明
Output 属性可以传输文本数据或二进制数据。用 Output 属性传输文本数据,必须定义一个包含一个字符串的 Variant。发送二进制数据,必须传递一个包含字节数组的 Variant 到 Output 属性。
正常情况下,如果发送一个 ANSI 字符串到应用程序,可以以文本数据的形式发送。如果发送包含嵌入控制字符、Null 字符等等的数据,要以二进制形式发送。 数据类型 Variant
Output 属性示例
下面的例子说明如何将用户键入的每一个字符送到串行端口: Private Sub Form_KeyPress (KeyAscii As Integer) Dim Buffer as Variant ' 设置并打开窗口
MSComm1.CommPort = 1 MSComm1.PortOpen = True Buffer = Chr$(KeyAscii) MSComm1.Output = Buffer End Sub
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
If DEBFLG= 0 Then
Form1.Width = Form1.Width - Text5.Width Text5.Enabled = False Text5.Visible = False End If
On Error GoTo ERROR_FORM_LOAD '检测可用串口 For C = 1 To 4
If MSComm1.PortOpen Then MSComm1.PortOpen = False MSComm1.CommPort = C
If Not MSComm1.PortOpen Then MSComm1.PortOpen = True
If MSComm1.PortOpen Then MSComm1.PortOpen = False If COMX = 0 Then COMX = C FORM_LOAD_1: Next C
If COMX = 0 Then End On Error GoTo 0
Option1(COMX - 1).Value = True Exit Sub
ERROR_FORM_LOAD:
Option1(C - 1).Enabled = False Resume FORM_LOAD_1 End Sub '选择串行口
Private Sub Option1_Click(Index As Integer) COMX = Index + 1 Call INIT_MODEM End Sub
'初试化Modem
Private Sub INIT_MODEM()
If MSComm1.PortOpen Then MSComm1.PortOpen = False MSComm1.CommPort = COMX
If Not MSComm1.PortOpen Then MSComm1. PortOpen = True
MSComm1.Output = “AT#CID=1” + vbCr '检查Modem命令是否完成 Call CHK_MODEM
MSComm1.Output = “ATS0=0” + vbCr End Sub
'检查Modem命令是否完成 Private Sub CHK_MODEM() Dim T As Single Dim L As Integer
T = Timer Do
COMBUF = COMBUF + MSComm1.Input L = InStr(1, COMBUF,“OK”)
Loop Until L <> 0 Or Timer - T > 1 If L = 0 Then
Line1.Visible = True Line2.Visible = True Form1.Show
MsgBox “MODEM未联机”,vbOKOnly+vbCritical,“测试MODEM”Else
Line1.Visible = False Line2.Visible = False End If End Sub
'串行口接收事件处理
Private Sub MSComm1_OnComm() Dim CH, ST As String Dim LC As Integer
Select Case MSComm1.CommEvent '接收到Rthreshold个字符 Case comEvReceive
COMBUF = COMBUF + MSComm1.Input '读取串口数据 Do
LC = InStr(1, COMBUF, Chr(10)) If LC = 0 Then Exit Do
COMLIN = Left(COMBUF, LC)
COMBUF = Mid(COMBUF, LC + 1) CH = Left(COMLIN, 1)
If “ ” < CH And CH < Chr(127) And DEBFLG = 1 Then Text5.Text = Text5.Text + COMLIN Text5.SelStart = Len(Text5.Text) End If
'截取来电号码,并显示
If InStr(1, COMLIN“NMBR=”)<> 0 Then ST = Mid(COMLIN, 8)
Text2.Text=“ ”+Left$(ST,Len (ST) -2) + “ ” Form1.WindowState = 0 Timer1.Enabled = True Call BEEP_NO
'截取来电日期,并显示
ElseIf InStr(1, COMLIN, “DATE = ”) <> 0 Then Text3.Text = Str(Year(DATE)) +
“.”
+ Mid(COMLIN, 8, 2) + “.” + Mid(COMLIN, 10, 2) + “ ” '截取来电时间,并显示
ElseIf InStr(1, COMLIN, “TIME = ”) <> 0 Then
Text4.Text = “ ” + Mid(COMLIN, 8, 2) + “:” + Mid(COMLIN, 10, 2) '检测振铃个数
ElseIf InStr(1, COMLIN, “RING”) <> 0 Then Call BEEP_NO
If HANGUP = 1 Or BEEPNO = 15 Then Call HANG_UP '检测是否停止振铃
ElseIf Left(COMLIN, 3) = “000” Then BEEPNO = 0
Timer1.Enabled = False Form1.WindowState = 1 ProgressBar1.Value = 0 Frame3.Caption = “振铃数” End If Loop
'其他事件处理 Case comEvCTS Case comEvDSR Case comEvCD Case comEvRing Case comEventBreak Call INIT_MODEM Case Else
MsgBox “串口接收事件号:” & MSComm1.CommEvent & “ ”, vbOKOnly + vbCritical, “测试串行口” End Select End Sub
正在阅读:
VB中关于MSComm控件使用详解09-17
微机原理题库答案(1.x终极版)10-10
推进“一件事一次办”改革工作实施方案08-03
《化合价》评课09-25
数字电子技术基础-康华光第五版答案01-11
2013年福建高考理综试题( Word版含答案) - 图文11-15
-人教版八年级下册生物期中考试试卷05-22
计生委年度工作报告03-08
2018年浙江省温州育英国际实验学校高中竞赛实验班自主提前招生考试数学试题(附参考答案详解)01-29
vfp期末考试题库含答案10-21
- 元旦晚会节目单
- 学案
- 光电显示技术期末复习资料 - 图文
- p2p与供应链结合案例
- 2016--2017学年度第二学期五年级班主任工作计划
- 尔雅2017年西藏的历史和文化期末考试满分答案解析
- 智慧树创新工程实践期末考试答案
- 六年级下美术教案-有趣的纸浮雕广西版
- 设备操作规程汇编
- 通信综合实训系统实验报告
- 南京财经大学金融学期末考试简答题
- 现代服务业发展规划研究 - 图文
- 锚杆支护工知识竞赛题
- 实验五
- 债权法习题集及详细解答
- 上海寺庙大全 - 图文
- 机会成本在企业决策中的应用研究
- 高考总复习语文选择题百题精炼第一季专题01 识记现代汉语字音(教师版)
- A9785-B中文资料
- 56m连续梁主墩冷却管布置技术交底
- 控件
- 详解
- 使用
- MSComm
- 关于
- 最新冀教版小学六年级科学下册期末试题及答案(4)
- 供电局配电线路工专业技术工作总结
- 总账和明细账的平行登记练习题
- 无菌检查方法的验证
- 西北大学化学与材料科学2014年硕士研究生复试名单及排名 - 图文
- 丝网
- 大学生创业计划书之蛋糕店
- “十三五”重点项目-地质灾害土层含水量测试仪项目可行性研究报告 - 图文
- 中国政法大学法硕考研分数线大概是多少(精)
- 卫生局创先争优活动阶段总结
- 数据结构课程设计报告
- 建筑企业画册文案2
- 农村公共服务运行维护自查报告
- 中国传统文化概论资料
- 2014年房产经纪人话术大全之常用经典话术每日一讲(6月26日)
- 陪检中心工作总结
- 全国法院第二十一届学术讨论会获奖名单
- 药用高分子材料学复习题
- 安检职业技能鉴定口试题
- WinXP、Win7脚本自动加域及用户资料迁移(一) - 图文