(转)EXCEL中使用串口通讯收发数据
jrcsh2012/01/04软件综合 IP:广东
[blockquote]VBA的妙用:串口通讯程序与EXCEL相结合

发布时间:2010-3-11    发布者:北京世纪长秋科技有限公司
[/blockquote]
[blockquote]
    1 VBA简介
      Visual Basic的应用程序版(VBA)是Microsoft公司长期追求的目标,使可编程应用软件得到完美的实现,它作为一种通用的宏语言可被所有的Microsoft 可编程应用软件所共享。在没有VBA以前,一些应用软件如Excel、Word、Access、Project等都采用自己的宏语言供用户开发使用,但每种宏语言都是独立的,需要用户专门去学习,它们之间互不兼容,使得应用软件之间不能在程序上互联。拥有一种可跨越多个应用软件,使各应用软件产品具有高效、灵活且一致性的开发工具是至关重要的。VBA作为一种新一代的标准宏语言,具有上述跨越多种应用软件并且具有控制应用软件对象的能力,使得程序设计人员仅需学习一种统一的标准宏语言,就可以转换到特定的应用软件上去,程序设计人员在编程和调试代码时所看到的是相同的用户界面,而且VBA与原应用软件的宏语言相兼容,以保障用户在代码和工作上的投资。有了VBA以后,多种应用程序共用一种宏语言,节省了程序人员的学习时间,提高了不同应用软件间的相互开发和调用能力。
    2 串口通讯程序
      简单的串口通讯程序一般是先由上位机向下位机发送读(write)或写(read)数据命令,然后等待下位机应答;下位机接受到命令之后,首先要对数据命令进行校验,对于符合校验约束的命令下位机会将相应的数据回复到上位机,对于不符合校验约束的命令下位机或将其抛弃或回复错误信息;上位机接收到下位机的响应之后,首先要对接收到的回复信息进行校验,对不符合校验约束的数据进行异常处理,对符合校验约束的信息进行解码,解码之后的信息便是上位机从下位机获得的有效信息了。
      上位机向串口发送读命令之后需要等待下位机应答并读取回复信息,常用的等待有3种方式:
    1) 轮询式
      上位机向串口发送读命令之后一直等待下位机应答,通讯程序处于一个等待循环中。
      优点:速度快、误码率低(几乎不存在误码)。
      缺点:消耗CPU。(解决办法:使用Sleep()API函数)。
    2) 消息式
      消息式通讯是采用响应WINDOWS消息的办法读取串口。
      优点:节省CPU、误码率低。
      缺点:发送接收机制过于繁琐。
    3) 定时接收式
      定时接收式通讯是根据预设的定时器时间进行读取数据。
      优点:发送接收机制相对简单、节省CPU。
      缺点:误码率太高,不同的硬件需要配置不同的通讯时间参数,需要严格的校验运算。
    3 EXCEL-VBA串口通讯实例
      软件:EXCEL。
      硬件:艾默生EC10 PLC。
      功能:通过EXCEL中的按钮控制PLC的输出继电器Y0。
      界面:RUN(运行通讯)、STOP(停止通讯)、Y0(Y0 ON/OFF控制)。




    aaaaaaaa.jpg







      主程序:
        Option Explicit
        Public Declare  Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
        Public Declare  Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
        Public Declare  Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
        Public com1 As New XXXXXXXXXXXXComm
        Public y0Stt As Boolean
        Public y0_on As Boolean
        Public tmrFlag As Boolean
        Public tmr As Long
        Sub runn()
          On Error GoTo ed
          XXXXXXXttings = "9600,e,8,1"
          If com1.PortOpen = False Then
            com1.PortOpen = True
          End If
          tmr = SetTimer(0, 0, 500, AddressOf ontimer)
          Exit Sub
        ed:
        MsgBox "串口打开错误!"
        End Sub
        Sub stopp()
          If com1.PortOpen = True Then
            com1.PortOpen = False
            KillTimer 0, tmr
          End If
        End Sub
        Public Function ontimer() 
        Dim a(7) As Byte
        Dim add As Long
        On Error GoTo ed
        If tmrFlag = False Then
          tmrFlag = True
          If y0_on = True Then
            y0_on = False
            If y0Stt = True Then
            a(0) = &H1
            a(1) = &H5
            a(2) = &H0
            a(3) = &H0
            a(4) = &HFF
            a(5) = &H0
            a(6) = &H8C
            a(7) = &H3A
            com1.Output = a
            add = 0
            Do
              DoEvents
              Sleep 10
              add = add + 1
              If add >= 100 Then
                Exit Do
              End If
            Loop Until XXXXXXXBufferCount  >= 8
            Else
            a(0) = &H1
            a(1) = &H5
            a(2) = &H0
            a(3) = &H0
            a(4) = &H0
            a(5) = &H0
            a(6) = &HCD
            a(7) = &HCA
            com1.Output = a
            add = 0
            Do
              DoEvents
              Sleep 10
              add = add + 1
              If add >= 100 Then
                Exit Do
              End If
            Loop Until XXXXXXXBufferCount  >= 8
            End If
          End If
        End If
        tmrFlag = False
        Exit Function
        ed: MsgBox "串口错误!"
        tmrFlag = False
        End Function

        界面程序:
        Private Sub cmd1_Click()
        y0_on = True
        y0Stt = Not y0Stt
        End Sub
        Private Sub cmdRun_Click()
        runn
        XXXXXXXXXXXXlue = 1
        End Sub
        Private Sub cmdStop_Click()
        stopp
        XXXXXXXXXXXXlue = 0
        End Sub

      4 结束语
        由上可见,VBA已经广泛应用于微软的应用软件当中,所以为更好的完善二次开发功能,众多的组态软件都在VBA支持上做了努力,世纪星组态软件开发语言已与VBA非常相似,相信在未来的版本中,世纪星将全面支持VBA,它的二次开发功能会迈上一个新的台阶。




      本信息来源于网络,不代表本站观点

[/blockquote]
+50  科创币    ehco    2012/01/04 高质量发帖
来自:计算机科学 / 软件综合
4
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
AsyncMaster
12年6个月前 IP:未同步
350602
好蛋疼,不如直接用vb
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
mm275861
11年11个月前 IP:未同步
434193
喜欢这种技术啊
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
acmilan
11年11个月前 IP:未同步
434258
[s:275]VB6还靠谱一点,能编译自然代码,速度和原生C语言相差无几
这年头还研究VBA6~~~雷~~~VBA6甚至不如ASP和VBScript
我目前能找到的唯一的ASP网站就是XXXXXXXXXXXXXXX了[s:275]
其它网站几乎都改成php或XXXXXXt或ruby on rails的了
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
jrcsh
学者 笔友
文章
491
回复
6730
学术分
4
2009/01/02注册,6年5个月前活动

.

主体类型:个人
所属领域:无
认证方式:邮箱
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}