注册名:

密码:

个人注册

企业注册

商务申请

商务管理平台

企业管理平台

个人管理平台

我的工控博客

中国工控网www.chinakong.com

首页 | 新闻中心 | 工控论坛 | 经验视点 | 工控商务 | 电气手册 | 工控博客 | 招聘求职 | 网上调查 | 企业中心 | 供求信息 | 资料中心 | 工控书店

所在位置:工控博客苑 -- 狂龙 -- Visual Basic 6.0 中通讯控件的应用(转载)

中国工控网搜索:

吴先生

     学历:硕士研究生
     职称:高级工程师
     年龄:57岁
       新闻信息(0/0)
       工作图片(0)
       技术论文(0/0)
       交流论坛(1/5)
       留言信箱(0)
       浏览人次:4360
发表人:wosinfei 发表时间:2007/5/14 11:16:00

 

发表新论题

 本栏论题: Visual Basic 6.0 中通讯控件的应用(转载)  [9093]
    张国荣 曹彩萍 史斌宁(合肥工业大学)
   
    摘 要:随着智能测试仪器的快速增长,通过PC机来接收和处理它们采集的数据日显重要,因此掌握如何编写PC机的串口通讯程序很有实际意义。本文介绍了Visual Basic 6.0中的通讯控件的使用,并结合一个实例程序加以具体说明。
   
    关键词:Visual Basic;通讯控件;串行口
   
    现在大量的智能地质仪器都具备了RS-232通信接口,并提供了相应的通信协议,能够将测试、采集的数据传输给计算机等设备,以便进行大量数据储存、处理、查询和分析。通常便携式计算机是最便捷的工具,因为它不仅携带方便、处理和存储能力足够强,而且有丰富和强大的软件开发工具。Visual Basic是许多工程技术人员熟悉和常用的应用程序开发软件,如何用Visual Basic 6.0编写一个与相关仪器进行数据交换的通信程序,并将其链接到自己的数据处理软件,对于许多野外地质技术人员都很有实际意义。
   
    一、MSComm通讯控件简介
   
    微软的软件系统中,提供了MSComm通讯控件。该控件在windows\system目录下。通讯控件是PC机通过串行端口与其它设备实现轻松连接的通用工具,Visual basic、Visual C++等开发人员都可以使用它。通过使用MSComm通讯控件,可以简单高效地实现设备之间的通讯,而不必调用低级的API函数,从而使编程效率大大提高,也降低了因编程不当导致系统不稳定。
   
    二、设计方法
   
    1、创建新的工程
   
    启动Visual Basic 6.0
   
    在“文件”菜单中,单击“新建工程”,选择“标准.exe”,单击确定
   
    2、加入MSComm控件
   
    在“工程”菜单中,单击“部件”显示“部件”对话框
   
    选定“Microsoft Comm Control 6.0”控件名称左边的复选框
   
    单击“确定”关闭“部件”对话框。MSComm控件将出现在工具框中
   
    将MSComm控件添加到窗体上
   
    3、属性设置
   
    现用实例具体说明。本实例用于接收和发送不定长数据包,该仪器的通信协议如下:
   
    (1)链路层:8位数据位、1位停止位、无奇偶校验、19200波特率。
   
    (2)包格式如下:
   
    包头
    站点号
    命令
    包序号
    数据长度
    数据1
    …
    数据n
    校验和
    包尾
   
    4个0xfe
    1byte
    1byte
    2byte
    2byte
    1byte
    …
    1byte
    2byte
    6个0xfc
   
   
    CommPort 设置并返回通讯端口号。1~16,设置:1为COM1口
   
    InBufferSize 设置并返回接收缓冲区的大小,以字节数为单位。设置:16500
   
    InputMode 设置并返回数据输入方式。设置:comInputModeBinary输入为二进制数据
   
    OutBufferSize 设置并返回输出缓冲区的大小,以字节数为单位。设置:512
   
    Rthreshold设置并返回要接收的字符数。当接收缓冲区中的字符数大于等于该值时,将产生OnComm事件。设置:10
   
    Setting以字符串形式设置或返回波特率、奇偶校验、数据位和停止位。设置:19200,n,8,1
   
    4、编写代码
   
    在窗体中加入一个组合框控件,名称为Comboport,用于选择设置通讯端口。加入一个命令按钮,用于控制通讯。加入一个通讯控件,名称为MSComm1。加入一个文本框控件,名称为Text1,用于显示接收的数据。
   
    在窗体的Load事件中加入下列代码:
   
    Private Sub Form_Load()
   
    Dim I As Integer
   
    For I = 1 To 16 '将项目添加到端口设置组合框控件
   
    Comboport.AddItem "Com" & Trim$(Str$(I))
   
    Next IComboport.ListIndex=MSComm1.CommPort – 1 '设置组合框控件缺省项目索引
   
    strtemp = "" '清空接收数据串
   
    End Sub
   
    在命令按钮[进行通讯]的Click事件中加入如下代码:
   
    Private Sub Command1_Click() '[进行通讯]按钮处理程序
   
    Dim sendarr(30) As Byte '发送数据缓冲区
   
    Text1.Text = "" '清数据显示区
   
    If MSComm1.PortOpen Then '关闭串行口
   
    MSComm1.PortOpen = False
   
    End If
   
    MSComm1.CommPort = Comboport.ListIndex + 1 '设置串行口号
   
    MSComm1.RThreshold = 10 '设置至少要接收的字符数
   
    MSComm1.PortOpen = True '打开串行口
   
    sendarr(0) = &HFE '填发送收据
   
    sendarr(1) = &HFE
   
    sendarr(2) = &HFE
   
    sendarr(3) = &HFE
   
    sendarr(4) = &H30
   
    sendarr(5) = &H32
   
    sendarr(6) = &H0
   
    sendarr(7) = &H30
   
    sendarr(8) = &H0
   
    sendarr(9) = &H0
   
    sendarr(10) = &HFC
   
    sendarr(11) = &HFC
   
    sendarr(12) = &HFC
   
    sendarr(13) = &HFC
   
    sendarr(14) = &HFC
   
    sendarr(15) = &HFC
   
    MSComm1.Output = sendarr '发送给通讯控件
   
    End Sub
   
    在通讯控件的OnComm事件中加入如下代码:
   
    Private Sub MSComm1_OnComm()
   
    Dim Buffer As Variant '从通讯端口读取二进制数据,必须把它赋给一个字节数组
   
    Dim Arr() As Byte
   
    Static intcount As Integer '存储获得接收数据长度时已读入的字节数
   
    Static templen As Integer '存储接收数据长度
   
    Dim I As Integer
   
    Dim bufcount As Integer
   
    Static checksum As Long '存储计算的校验和
   
    Dim recievesum As Long '存储接收的校验和
   
    Select Case MSComm1.CommEvent '根据 CommEvent 属性值分支处理
   
    Case comEvReceive '接收到规定个数字符
   
    bufcount = MSComm1.InBufferCount '获得已接收字符数
   
    Buffer = MSComm1.Input '读接收的二进制数据
   
    Arr = Buffer '赋值于字节数组以便处理
   
    If intcount = 0 Then '读入的是数据长度
   
    templen = Arr(8) * 256 + Arr(9) '获得数据长度
   
    If templen + 15 > bufcount Then '设置下次读入字节数
   
    MSComm1.RThreshold = templen + 15 - bufcount
   
    Else
   
    MSComm1.RThreshold = 1
   
    End If
   
    intcount = bufcount '存储已读入接收数据的字节数
   
    For I = 0 To bufcount - 1
   
    recievebuf(I) = Arr(I) '存储数据到接收数据缓冲区
   
    strtemp = strtemp + Str(Arr(I)) '转换成字符串以便显示
   
    If I >= 10 Then
   
    checksum = checksum + Arr(I) '计算校验和
   
    End If
   
    Next I
   
    Text1.Text = strtemp '显示接收数据
   
    Else '读入的是数据
   
    For I = 0 To bufcount - 1
   
    recievebuf(intcount + I) = Arr(I) '存储数据到接收数据缓冲区
   
    strtemp = strtemp + Str(Arr(I)) '转换成字符串以便显示
   
    If intcount + I < templen + 10 Then
   
    checksum = checksum + Arr(I) '计算校验和
   
    End If
   
    Next I
   
    Text1.Text = strtemp '显示接收数据
   
    '计算接收到的校验和
   
    recievesum = recievebuf(templen + 10) * 2 ^ 8 + recievebuf(templen + 11)
   
    '比较校验和
   
    If (recievesum Mod 65536) <> (checksum Mod 65536) Then
   
    MsgBox "校验和错", vbOKOnly, "Confirm" ' 显示信息。
   
    End If
   
    checksum = 0 '准备下次接收,设置初始数据
   
    recievesum = 0
   
    strtemp = ""
   
    MSComm1.RThreshold = 10
   
    intcount = 0
   
    MSComm1.PortOpen = False '关闭串行口
   
    End If
   
    End Select
   
    End Sub
   
    三、结束语
   
    本实例已投入实际使用,它虽然只是针对一种仪器的协议编写的,但其方法和步骤完全适用于其它仪器设备。希望本文能给读者提供一些参考与启迪。
   
   
 

以下是关于《Visual Basic 6.0 中通讯控件的应用(转载)》论题的回复(共5篇)

回复人:xiashuangr

 回复时间:2007/9/20 6:49:00

    顶起,正需要

回复人:剑胆琴心

 回复时间:2008/12/6 13:03:00

    我是想学VB的菜鸟,希望能向大哥你多多学习

回复人:676967246

 回复时间:2011/5/27 8:29:00

    谢谢,正需要

回复人:fg1007

 回复时间:2011/6/11 17:00:00

    好啊,详细点就更实用了

回复人:xsliweju

 回复时间:2019/12/15 11:19:00

    不错不错,正好学习一下了~

如果要回复本栏论题,请首先登陆网站

·如果你已经是中国工控网www.chinakong.com成员,请直接登录。

·如果你还不是中国工控网www.chinakong.com成员,请首先注册,注册为免费!

注册名:

密  码:

           注册中国工控网www.chinakong.com
           忘记密码
 
     相关技术论坛:

关于我们     免责声明     服务项目     广告联系     友情链接     联系方式     意见反馈     设为首页     加入收藏

 ©2023-2025 中国工控网(www.chinakong.com) 版权所有 豫ICP备17046657号

管理员信箱:chinakong98@163.com  服务热线:13525974529

洛阳博德工控自动化技术有限公司

中国    洛阳