VB 版 (精华区)

发信人: zxfsnow (最近睡眠太少), 信区: VB
标  题: 基于Win95的VB5串口通信程序 
发信站: 哈工大紫丁香 (2000年06月07日20:01:45 星期三), 转信

发信人: prosignia (蔚蓝&微澜), 信区: VB
标  题: 基于Win95的VB5串口通信程序
发信站: NJU Lily BBS (Fri Mar 19 15:54:02 1999), 转信





山东省水文水资源勘测局(250014) 郭增
    Visual Basic5.0(以下简称VB)以其简单易学、32位面向对象的程序设计等特点,倍
受广大计算机开发者的青睐,已广泛地应用于各个领域;在实时监测系统中串行端口通信
是一项基础功能,因此我们使用VB5编写了实时水库水文自动监测系统的后台机软件。本
文就Windows 95环境中采用VB5设计串行端口通信程序进行讨论并给出实例。
    一般用VB开发串行通信程序有两种方法:一是利用Windows的通信API函数;另一种是
采用VB标准控件Mscomm来实现。
    Windows 95的通信API
    Windows 95中的串口通信API函数不同于Windows3.x中的OpenComm、CloseComm、Re
adComm、WriteComm,而是采用硬件与文件通用的函数CreateFile、ReadFile、WriteFil
e、CloseHandle, 该类函数更具有一般性,并且可以用EscapeCommFunction函数实现底层
硬件操作,比如:SETXOFF、 CLRDTR等。
    利用API编写串口通信程序较为复杂,需要掌握大量通信知识,其优点是可实现的功能
更丰富、应用面更广泛,更适合于编写较为复杂的低层次通信程序。采用这种方法编写串
行端口通信程序一般可分为以下几个过程:
    1. 初始化串行端口
    首先用CreateFile函数打开指定串口,置参数中访问类型为GENERIC_READ |GENERIC
_WRITE、共享模式为0、创建标志为OPEN_EXISTING、模板句柄为NULL。
    2. 配置串口
    Windows 95的串口配置比Windows 3.x较为复杂,但其功能更强大,对一般程序可使用
CommConfigDialog函数以对话框方式设置波特率、数据位、奇偶校验、停止位和流控制
方式,并且可以恢复缺省值。
    3. 超时控制
    为了防止意外情况使串口读写无休止地等待,Windows 95提供了超时设置,这是由CO
MMTIMEOUTS结构定义的,通过调用GetCcommTimeOuts函数获得当前的设置,用SetCommTim
eOuts函数来完成设置。
    4. 数据传输
    读写串行端口与读写文件采用的函数相同,即ReadFile、WriteFile, 读写操作可分
四种方式: 查询方式、同步I/O、异步(后台)I/O和事件驱动I/O。
    5. 关闭串口
    程序的终止可以自动关闭串口,也可用函数CloseHandle(),以便释放所独占资源。
    VB通信控件Mscomm
    Mscomm控件提供了功能完善的串口数据的发送和接收功能,Mscomm控件具有两种处理
方式: 1事件驱动方式:由Mscomm控件的OnComm事件捕获并处理通信错误及事件;2查询方
式:通过检查CommEvent属性的值来判断事件和错误。
    Mscomm控件的通信功能实现,实际上是调用了API函数,而API函数是由Comm.drv解释
并传给设备驱动程序执行的,对于VB程序开发者只需知道Mscomm控件的属性和事件的用法
即可以实现串口的操作。
    以下是Mscomm控件的主要属性和方法:
    1) CommPort:设置或返回串行端口号,其取值范围为1~99,缺省为1。
    2) Setting设置或返回串行端口的波特率、奇偶校验位、数据位数、停止位。如:M
scomm.Setting="9600,N,8,1"。
    3) PortOpen:打开或关闭串行端口,格式为:Mscomm.PortOpen={TRUE|FALSE}。
    4) InBufferSize:设置或返回接收缓冲区的大小,缺省为1024字节。
    5) InBufferCount:返回接收缓冲区内的等待读取的字节个数,可通过设置该属性为
0来清除接收缓冲区。
    6) RThreshold:该属性为一阀值,它确定当接收缓冲区内字节个数达到或超过该值后
就产生代码为MSCOMM_EV_RECEIVE的OnComm事件。
    7) InputLen: 设置或返回接收缓冲区内用Input读入的个数。若取0,则INPUT读取整
个缓冲区的内容。
    8) Input: 该属性表示从接收缓冲区移走一串字符。
    9) OutBufferSize:设置或返回发送缓冲区,缺省为512字节。
    10) OutBufferCounter:返回发送缓冲区内等待发送的字符数,可用来清空缓冲区。
    11) Output:向发送缓冲区传送一字符串。
    12) EOFEnable:若置TRUE,则当输入中出现EOF,就停止输入并产生OnComm事件。
    如果在通信过程中发生错误或事件,就会引发OnComm事件并且改变属性值,由CommEv
ent属性代码反映错误类型,在通信程序的设计中可根据该属性值来执行不同的操作,以下
是部分属性常数值及其含义:
    1) ComEvSend: 其值为1,发送缓冲区的内容少于SThreshold指定的值。
    2) ComEvReceive: 其值为2,接收缓冲区内字符数达到 RThreshold 值,该事件在缓
冲区中数据被移走前将持续产生。
    3) ComEventFrame: 其值为1004,硬件检测到帧错误。
    4) ComEventRxOver: 其值为1008,接收缓冲区溢出。
    5) ComEventTxFull: 其值为1010,发送缓冲区溢出。
    6) ComEventRxParity: 其值为1009,奇偶校验。
    7) ComEvEOF: 其值为7,接收数据中出现文件结束(ASCII 码为 26)字符。
    程序样例
    采用Mscomm控件实现串口通信时,首先添加一Mscomm控件到窗体中,该控件一般不在
通用工具窗口中,而是需通过菜单项"工程(P)→部件(O)"进入选择窗口,在控件tab页中选
取Microsoft Comm Control 5.0 ,此时工具窗口中出现Mscomm图标,即可被使用。
    以下是事件驱动方式的接收程序的主要部分:
    Private Sub getdatafromserial_Click()
    CommonDialog1.InitDir = "c:\temp"
    CommonDialog1.ShowSave
    mainfrm.MSComm1.CommPort=1
    hfile = FreeFile
    ’打开存储接收数据的文件
    Open CommonDialog1.filename For Output As #hfile
    ’设接收缓冲区的大小,可按量确定
    mainfrm.MSComm1.InBufferSize = 4096
    If Not mainfrm.MSComm1.PortOpen Then ’打开串口
    mainfrm.MSComm1.PortOpen = True
    End If
    If Err Then
    MsgBox "Communcation port cannot be opened!!"
    ’清接收缓冲区
    mainfrm.MSComm1.InBufferCount = 0
    ’设一次读入的长度,可根据数据格式设置
    mainfrm.MSComm1.InputLen = 77  ’设置接收事件触发的阀值
    mainfrm.MSComm1.RThreshold = 77
    counter = Timer + 10
    Do
    If Timer > counter Then
    mainfrm.Label1.Caption = "正在通信......"
      mainfrm.Label1.Refresh
      counter = Timer + 10
    End If
    DoEvents
    Loop
    End Sub
    以下为事件处理子程序,flag为一静态变量记录读取次数,以便改变接收数据的长度
,读者可根据实际需要添加其它处理内容:
    Private Sub MSComm1_OnComm()
    Select Case MSComm1.CommEvent
    Case comEvReceive
    If flag > 246 Then
     MSComm1.InputLen = 0: MSComm1.RThreshold = 32
    End If
    buffer = MSComm1.Input
    temp = buffer
    Print #hfile, temp
    counter = Timer + 10
    Do While Timer > counter
    Do Events
    Loop
    flag = flag + 1
    Case comEvEOF
    EVMsg$ = "检测到文件结尾!!!"
    Case comFrame
    ERMsg$ = "帧出错!!!"
    Case comRxParity
    ERMsg$ = "奇偶错!!!"
    End Select
    If Len(EVMsg$) Then
    Text1.Text = "Status: " & EVMsg$
    ElseIf Len(ERMsg$) Then
    Text1.Text = "Status: " & ERMsg$
    Beep
    Ret = MsgBox(ERMsg$, 1, "Click Cancel to
     quit, OK to ignore.")
    MSComm1.PortOpen = False
    End If
    End Sub
  
--

 以科计为本,以产业报国!
  超越自我,飞跃无限!
  

※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.235.249]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.757毫秒