首页 期刊简介 最新目录 过往期刊 在线投稿 欢迎订阅 访客留言 联系我们
新版网站改版了,欢迎提出建议。
访客留言
邮箱:
留言:
  
联系我们

合作经济与科技杂志社

地址:石家庄市建设南大街21号

邮编:050011

电话:0311-86049879
友情链接
·中国知网 ·万方数据
·北京超星 ·重庆维普
经济/产业

信息类别

首页/本刊文章/第366期/科技/创新/正文

发布时间

2009/4/1

作者

□文/程巍巍

浏览次数

7865 次

VB6.0的MSComm通信控件应用举例
  提要 本文介绍了基于VB6.0的MSComm通信控件相关理论,并以一个实例演示了MSComm控件的主要属性。
  关键词:串行通信;VB6.0;MSComm控件
  中图分类号:F49 文献标识码:A
  在当今这个科技飞速发展的时代,我们经常需要在计算机与其他设备之间进行通信,而串行通信作为一种灵活、方便、可靠的通信方式被广泛采用。在开发串行通信程序的过程中,利用微软的MSComm通信控件相对比较简单,该控件具有丰富的与串行通信密切相关的属性及事件,提供了对串口的各种操作。MSComm控件在VB中容易使用,在串口编程时也非常方便,程序员不必花时间去了解较为复杂的API函数。
  一、用VB6.0进行串行通信程序的设计方法简介
  用visual basic6.0进行串行通信程序的设计有两种方式:(1)直接调用Windows API。(2)使用通信组件。该方式实际上是通过通信组件间接调用Windows API函数,其过程要比直接调用API要复杂,但在程序上容易实现。使用MSComm控件时,实际上就是使用了API函数,API函数将被Comm.drv解释并传送给外围设备驱动程序,使用MSComm的用户只需要关心如何使用MSComm所提供的属性或事件,以驱动API函数的接口完成工作。
  二、串行通信程序的执行过程
   MSComm控件通过串行端口传输和接收数据,为应用程序提供串行通信功能。该控件提供了两种处理通信的方式:
  1、事件驱动通信。事件驱动通信是处理串行端口交互作用的一种非常有效的方式。在使用事件驱动通信时,每当有一个字符到达或端口状态发生改变,或发生错误时,MSComm控件将触发OnComm事件进行捕获,通过检查MSComm控件的CommEvent属性获知所发生的事件或错误,从而采取相应的操作处理这些通信事件。这种方法的优点是程序响应及时,可靠性高。
  2、查询法。该方法可以在程序的每个关键功能之后,通过检查CommEvent属性的值来查询事件和错误。每个使用的MSComm控件对应着一个串行端口。如果应用程序需要访问多个串行端口,必须使用多个MSComm控件。
  查询法适合于较小的应用程序,在这种情况下,每当应用程序执行完某一串行口操作后,将不断检查MSComm控件的CommEvent属性,以检查执行结果或检查某一事件是否发生。
  而进行串行通信时一般有两种传输方式:
  (1)字符形式:通常以小于ASCII码128的字符码来传递,通常用于传送指令。
  (2)二进制形式:将数据以二进制编码的方式传递,它可能含有ASCII码128以上的字符码。通常用来传送数据,以提高速度。
  三、串行通信实例
  下面以一个实例来演示MSComm控件的主要属性。根据程序需要,进行以下操作步骤:
  1、新建工程。启动VB后,新建一个标准的EXE工程。
  2、设计用户界面。(1)在“工具”菜单中选中“部件”,在“控件”选项卡中选择“Microsoft Comm Controls6.0”。然后从工具箱中将MSComm添加到窗体Form1中。(2)给窗体Form1添加1个计时器控件,3个命令按钮控件,并设置控件的相关属性。(表1)
  3、编写程序代码
Option Explicit
Public echo As Boolean'回应‘打开/关闭’标志
Dim ret As Integer'设为整数
Dim starttime As Data'为端口计时器存储开始时间
Private Sub command1_click()
 On Error Resume Next
  Dim openflag
  MSComm1.PortOpen = Not MSComm1.PortOpen
  If Err Then MsgBox Error$,48
  openflag = MSComm1.PortOpen
  If MSComm1.PortOpen Then
   starttiming
  End If
End Sub
Private Sub Command2_Click()
 On Local Error Resume Next
 Static num As String
 num="1-029-8936-6735"'MSDN的电话号码'从用户处获得电话号码
 num=InputBox$("输入电话号码:","拨打电话号码",num)
 If num="" Then Exit Sub
 If Not MSComm1.PortOpen Then'如果端口没有打开则打开它
  If Err Then Exit Sub
 End If
 MSComm1.Output="ATDT" & num & vbCrLf'拨打电话号码
 starttiming'启动端口计时器
End Sub
Private Sub Command3_Click()
 On Error Resume Next
 MSComm1.Output="ATH"'发送挂机字符串
 ret=MSComm1.DTREnable'保存当前设置
 MSComm1.DTREnable=True'打开DTR
 MSComm1.DTREnable=False'关闭DTR
 MSComm1.DTREnable=ret'恢复原来的设置'如果端口确实处于打开状态,则关闭它
 If MSComm1.PortOpen Then MSComm1.PortOpen = False
 If Err Then MsgBox Error$,48'通知用户错误信息
 stoptiming'停止端口计时器
 On Error GoTo 0
End Sub
'oncomm事件被用于捕获communications事件及错误
Private Static Sub MSComm1_OnComm()
 Dim evmsg$
 Dim ermsg$
'依据commecent属性进行分支
 Select Case MSComm1.CommEvent
'事件信息
   Case comEvReceive
   Dim buffer As Variant
   buffer = MSComm1.Input
   Debug.Print "接收-" & StrConv(buffer,vbUnicode)
   'showdate txtterm,(StrConv(buffer,vbUnicode))
  Case comEvSend
  Case comEvCTS
   evmsg$="被检测的CTS改变"
  Case comEvDSR
   evmsg$="被检测的DSR改变"
  Case comEvCD
   evmsg$="被检测的CD改变"
  Case comEvRing
   evmsg$="电话铃响起"
  Case comEvEOF
   evmsg$="被检测的文件结尾"
  Case comBreak
   ermsg$="收到中断"
  Case comCDTO
   ermsg$="运输检测超时"
  Case comCTSTO
    ermsg$="CTS超时"
  Case comDCB
   ermsg$="检索DCB错误"
  Case comDSRTO
   ermsg$="DSR超时"
  Case comFrame
   ermsg$="帧错误"
  Case comOverrun
   ermsg$="超限错误"
  Case comRxOver
   ermsg$="接收缓冲区溢出"
  Case comRxParity
   ermsg$="奇偶校验错"
  Case comTxFull
    ermsg$="传送缓冲区满"
  Case Else
   ermsg$="未知的错误或事件"
 End Select
End Sub
Private Sub starttiming()
'调用此函数启动连接时间计时器
 starttime=Now
 Timer1.Enabled=True
End Sub
Private Sub stoptiming()
'调用此函数停止计时
 Timer1.Enabled = False
End Sub
  程序执行时的界面如下图:








  (作者单位:西安欧亚学院信息工程学院)
 
版权所有:合作经济与科技杂志社 备案号:冀ICP备12020543号
您是本站第 25849242 位访客