奇趣技术网 收藏本站
设为主页
商务合作
首页 新闻中心 行业动态 软件新闻 安全资讯 病毒预警 漏洞发布 操作系统 Dos Win9x Win2000 WinXP Win2003 WinVista Linux Unix
数据库 DB2 Access MSSQL MySQL Oracle Sybase 编程技术 ASP PHP JSP CGI/Perl XML .Net C/C++/C# VB VC Delphi Java 汇编
安全技术 安全教学 工具介绍 漏洞利用 病毒防范 入侵检测 防火墙 安全防范 汉化破解 攻击实例 加密解密 技术论坛
中华网络安全联盟 >> 程序开发 >> VB >> Visual Basic串口通讯调试方法
程序开发
Asp
PHP
JSP
CGI/Perl
XML
.Net
C/C++/C#
Visual Basic
Visual C++
Delphi
Java
汇编语言
  • VB中使用WinSock控件传

  • VB API函数介绍——控

  • VB从零开始编外挂(完整

  • VB.Net实现Web Servic

  • 老树新芽 体验Visual 

  • vb中利用xmlhttp来下载

  • vb中使用正则表达式

  • ASP.NET中Cookie编程的

  • Visual Basic串口通讯调试方法
    字体:

    中华网络安全联盟    作者:佚名    来源:网络转载    时间:2006-3-22

      现有电子秤一台,使用串口与计算机进行通讯。编写VB程序来访问串口,达到读取电子秤上显示的数据。该电子秤为BE01型仪表,输出为RS-232C标准接口,波特率为300-9600、偶校验、7个数据位、2个停止位。所有字符均发送11位ASCII码,一个起始位。在VB中与串口通讯需要引入控件MSComm串口通讯控件(在Microsoft Comm Control 6.0中)。具体程序如下:控件简称:MSC

    Dim Out(12) As Byte '接收var中的值
    Dim var As Variant '接收MSC.input中的数值
    Dim nRece As Integer '计算MSC.inputbuffer的个数
    Dim i As Integer, j As Integer '随即变量,计算循环

    ****************************************************************************

    Private Sub Form_Load()
     ClearText
     With MSC
      .CommPort = 1 '设置Com1为通信端口
      .Settings = "9600,E,7,2" '设置通信端口参数 9600赫兹、偶校验、7个数据位、1个停止位.(这里需要进一步说明的是:.Setting=”BBBB,P,D,S”。
      含义是:B:Baud Rate(波特率);P:Parity(奇偶);D:Data Bit;S:Stop Bit)

      .InBufferSize = 40 '设置缓冲区接收数据为40字节
      .InputLen = 1 '设置Input一次从接收缓冲读取字节数为1
      .RThreshold = 1 '设置接收一个字节就产生OnComm事件

     End With

    End Sub

    ****************************************************************************

    Private Sub ClearText()
     Text3.Text = ""
     Text2.Text = "5"
     Text1.Text = ""
    End Sub

    Private Sub Command1_Click()
     ClearText
     ' nRece = 0 '计数器清零
     With MSC
      .InputMode = comInputModeBinary '设置数据接收模式为二进制形式
      .InBufferCount = 0 '清除接收缓冲区
      If Not .PortOpen Then
       .PortOpen = True '打开通信端口
      End If
     End With
    End Sub

    Private Sub MSC_OnComm()
     DelayTime ‘用来延续时间
     ClearText
     With MSC
      Select Case .CommEvent '判断通信事件
      Case comEvReceive: '收到Rthreshold个字节产生的接收事件
       SwichVar 1
       If Out(1) = 2 Then '判断是否为数据的开始标志
        .RThreshold = 0 '关闭OnComm事件接收
       End If
       Do
        DoEvents
       Loop Until .InBufferCount >= 3 '循环等待接收缓冲区>=3个字节
       ' nRece = nRece + 1
       For i = 2 To 12
        SwichVar i
        Text1.Text = Text1.Text & Chr(Out(i))
       Next
       Text1.Text = LTrim(Text1.Text)
       Text2.Text = Text2.Text & CStr(nRece)
       .RThreshold = 1 '打开MSComm事件接收
      Case Else
       ' .PortOpen = False
      End Select
     End With

    End Sub

    ****************************************************************************

    Private Sub DelayTime()

     Dim bDT As Boolean
     Dim sPrevious As Single, sLast As Single

     bDT = True

     sPrevious = Timer (Timer可以计算从子夜到现在所经过的秒数,在Microsoft Windows中,Timer函数可以返回一秒的小数部分)

     Do While bDT
      If Timer - sPrevious >= 0.3 Then bDT = False
     Loop
     bDT = True

    End Sub

    (通信传输速率为9600bps,则最快速度1.04ms发送一个字节,仪表每秒发送50帧数据,每帧数据有4个字节,即每秒发送200个字节,平均5.0ms 发送一个字节,连续读取串口数据时要在程序中添加循环等待程序)

    Private Sub SwichVar(ByVal nNum As Integer)

     DelayTime
     var = Null
     var = MSC.Input
     Out(nNum) = var(0)

    End Sub

    (设置接收数据模式采用二进制形式,即 InputMode=comInputModeBinary,但用Input属性读取数据时,不能直接赋值给 Byte 类型变量,只能通过先赋值给一个 Variant 类型变量,返回一个二进制数据的数组,再转换保存到Byte类型数变量中。)

    Private Sub Text1_Change()

     Text3.Text = CText(Text1.Text) - CText(Text2.Text)

    End Sub

    ****************************************************************************

    Private Function CText(ByVal str As String) As Currency

     If str <> "" Then
      CText = CCur(Val(str))
     Else
      CText = 0
     End If

    End Function

      (仪表每秒发送50帧数据,微机收到一帧完整数据至少需要20 ms时间,然后再进行数据处理。如果微机在下一帧数据接收前即20ms内能将数据计算处理完毕,则接收缓冲区内只会保存有一帧数据,不会存有两帧以上数据,接收缓冲区的大小不会影响实时监测效果(接收缓冲区>4字节),这时完全可以实现实时监测或实时控制;如果微机在20ms内不能将数据计算处理完毕,接收缓冲区设置得又很大,在数据计算处理完毕前,接收缓冲区内就会保存有两帧以上数据,而且一次工作时间越长,缓冲区内滞留数据帧就越多,数据采集和数据处理之间产生逐渐增大的额外时间差,当接收缓冲区充满后,时间差不再增大,固定在某一值,部分数据因不能及时采集到接收缓冲区中,数据产生丢失现象,真实工作情况就会和微机处理结果产生较大的时间差,对实时监测和实时控制很不利,这种情况下接收缓冲区的大小就会影响实时监测效果,所以接收缓冲区设置不能过大,以保证数据处理的实时性。) 小结:本文所用的仪表为梅特勒公司出产的BE01型电子秤,其输出的每个编码均为标准的ASCII码。其他的仪表存在发射的编码中含有BCD压缩码,而且分为高低位,需要接收后对其进行解码换算,之后还要将高位和低位数字进行相加,即可以将其BCD码换算成实数。另还存在误差的可能:判断最大值,仪表在刚开始工作时有干扰,会传导一些乱码,位移传感器有参数偏差,最大值一般都略大于50毫米,所以取51为极限最大值,取-51为极限最小值。暂时先写这些,当然其他的情况可以依此类推!

    字体:
     
    设为主页 收藏本站 联系我们 友情连接 商务合作 网友留言
    Copyright©2006-2008 中华网络安全联盟 All rights reserved.