想把电子称和电脑连接起来,电脑每隔几个毫秒记录数据,数据要求是十进制,并保存在TXT文本中,期望能绘出质量-时间曲线。现在已经连接好了,但是我没有学过VB,自己找了好多例子研究了好久,还是有很多问题不懂,按例子改写后实验,还是不行,可能我对这个串口通信不理解,改写后也总是有问题。下边是我的电子称说明书,不知有没有VB高手根据我的实际情况帮我编写符合要求能在电脑上保存数据的代码,非常感谢!一、利用立即打印符来接收数据
 当天平与计算机相连时,建议使用立即打印符“#”进行数据输出,当响应此命令后,天平立即把其显示的所有数字或者信息以字符串的形式输出出来。 
其输出格式如下: 
  +/- 1 2 3 4 5 6. C0  C1 C2 C3 CR LF 
前六个数字区,数字前通常还有符号(+或-),小数点也被传输。数字少于六位时由空格来补充(如有其它信息传输,则位于数字区) 
  注:小数点的位置取决于天平显示的分辨率及单位,第一个数字紧接在符号之后。 
C0:空格 
C1:如果天平被设置为“自动”响应模式,它亦为一个空格。 
    如果天平响应模式为“快速”,C1=F 
  如果天平响应模式为“慢速”,C1=S 
C2: 表示所传输的数字的单位,如称重单位为克,则传送g 
C3:代表稳定性,其功能与天平显示的“OK”功能相同,空格表示所传数字不稳定,“S”表示所传数字稳定。立即打印输出时,C3后边还跟有一个回车和一个换行符,如果天平已设置了其它换行数,它们和回车符一起传送。二、RS232接口硬件
虽然BL系列电子天平可与任何具有RS232接口的设备相连,但其接口并未采用RS232的所有通讯协议,它仅使用了标准接口的数据传输和接收线,但在许多应用中一般不会带来任何接口问题。 
数据格式: 
        1 起始位 
        8 数据位(包括校验) 
        1 停止位 
注:BL天平将以选定的检验形式传输数据,但它并不对收到的校验进行检验,请用RS232电缆将BL天平与外部设备相连或者按下面的说明来连线。         1  2  3  4  5                  PIN    功能 
      o  o  o  o  o                    2    TXD-天平数据发送线 
        o  o  o  o                      3    RXD-天平数据接收线 
        6  7  8  9                      5    GND-地 
此外,对于需要握手信号的计算机,为了能与BL系列天平进行通信,应将计算机RS232接口上的DTR、DSR和CTS与RTS分别短接在一起。 建议使用电缆长度不超过15m,如电缆电容《2,500PF,电缆还可适当长一些。所接负载的阻抗应介于 

解决方案 »

  1.   

    刚看到另一帖子你回复的代码。之前连接成功后,就去看其他相似的例子的VB代码,因为没有学过vb,在根据例子看语法理解什么意思,想试着编一编自己的,(不过问题重重,没有成功),没有及时查看自己发的帖子,不好意思!
    我刚刚看到后就试了,很好,哎,自己弄好久,还不如及时看帖子,非常感谢!虽然一次只能显示一个数据,并且要手动点击,跟要求还有点距离
      

  2.   

    LZ可以设置TIME定时去读就可以了.
      

  3.   

    正确!但做不到每隔几个毫秒读数据.
    Option Explicit
        Dim strss As StringPrivate Sub Command1_Click()        '发送
        Dim strSend As String
        strSend = "#"
        MSComm1.Output = strSend
    End SubPrivate Sub Form_Load()
        MSComm1.CommPort = 1            '串口号,
        MSComm1.Settings = "2400,n,8,1 "  '串口的属性
        MSComm1.InputLen = 0
        MSComm1.InputMode = comInputModeText
        MSComm1.RThreshold = 1
        MSComm1.PortOpen = True
        Timer1.Interval = 100
        Timer1.Enabled = True
    End SubPrivate Sub MSComm1_OnComm()
        Select Case MSComm1.CommEvent
            Case comEvReceive
                strss = strss & MSComm1.Input
                If Right(strss, 2) = vbCrLf Then
                    Label1.Caption = strss
                    Open App.Path & "\DATA.txt" For Append As #1
                        Print #1, strss
                    Close
                    strss = ""
                End If
            End Select
    End SubPrivate Sub Command2_Click() '停止接收
        If MSComm1.PortOpen = True Then
            MSComm1.PortOpen = False
        End If
    End SubPrivate Sub Timer1_Timer()
        Command1_Click
    End Sub
      

  4.   

    我运行了下,有两个问题想问下:
    data文件中出现  +0.00  GS    +0.00  GS   +69.17  G    +69.16  GS   +69.17  GS
    也就是说首次出现69.17这个数 它后边只有G,按道理应该还是GS吧,虽然对数据没有影响,这是为什么?还有,数据之间空的距离较大?不是应该紧密排列吗?我运行时把时间间隔为5000ms
    第二,当点击command2时,程序出现错误:实时错误“8018”,只有当端口打开时,操作有效。然后点击调试,程序语句MSComm1.Output = strSend被涂成黄色(不知怎样上传图片,所以就描述下)
      

  5.   

    见你自己提供的通信协议解释:
    C3:代表稳定性,其功能与天平显示的“OK”功能相同,空格表示所传数字不稳定,,“S”表示所传数字稳定。立即打印输出时,C3后边还跟有一个回车和一个换行符,如果天平已设置了其它换行数,它们和回车符一起传送。
      

  6.   

    楼主看看这个:http://download.csdn.net/source/1262066
      

  7.   

    我现在的代码是由TIMER自询的,无须按COMMAND1按钮.
    代码可修改为:
    Option Explicit
        Dim strss As StringPrivate Sub Form_Load()
        MSComm1.CommPort = 1            '串口号,
        MSComm1.Settings = "2400,n,8,1 "  '串口的属性
        MSComm1.InputLen = 0
        MSComm1.InputMode = comInputModeText
        MSComm1.RThreshold = 1
        MSComm1.PortOpen = True
        Timer1.Interval = 100
        Timer1.Enabled = True
    End SubPrivate Sub MSComm1_OnComm()
        Select Case MSComm1.CommEvent
            Case comEvReceive
                strss = strss & MSComm1.Input
                If Right(strss, 2) = vbCrLf Then
                    Label1.Caption = strss
                    Open App.Path & "\DATA.txt" For Append As #1
                        Print #1, strss
                    Close
                    strss = ""
                End If
            End Select
    End SubPrivate Sub Command2_Click() '停止接收
        If MSComm1.PortOpen = True Then
            MSComm1.PortOpen = False
        End If
    End SubPrivate Sub Timer1_Timer() '连续发送
        Dim strSend As String
        strSend = "#"
        MSComm1.Output = strSend
    End Sub
      

  8.   

    点击command2时,程序出现错误:实时错误“8018”,只有当端口打开时,操作有效。然后点击调试,程序语句MSComm1.Output = strSend被涂成黄色
    和上边那个代码是一样的
      

  9.   


    我的代码无Command2按钮!
      

  10.   

    Private Sub Command2_Click() '停止接收
        If MSComm1.PortOpen = True Then
            MSComm1.PortOpen = False
        End If
    End Sub
    怎么没有?
      

  11.   

    看化了,修改下代码:
    Option Explicit
        Dim strss As StringPrivate Sub Form_Load()
        MSComm1.CommPort = 1            '串口号,
        MSComm1.Settings = "2400,n,8,1 "  '串口的属性
        MSComm1.InputLen = 0
        MSComm1.InputMode = comInputModeText
        MSComm1.RThreshold = 1
        MSComm1.PortOpen = True
        Timer1.Interval = 100
        Timer1.Enabled = True
    End SubPrivate Sub MSComm1_OnComm()
        Select Case MSComm1.CommEvent
            Case comEvReceive
                strss = strss & MSComm1.Input
                If Right(strss, 2) = vbCrLf Then
                    Label1.Caption = strss
                    Open App.Path & "\DATA.txt" For Append As #1
                        Print #1, strss
                    Close
                    strss = ""
                End If
            End Select
    End SubPrivate Sub Timer1_Timer() '连续发送
        Dim strSend As String
        strSend = "#"
        If MSComm1.PortOpen = True Then
            MSComm1.Output = strSend
        End If
    End Sub
      

  12.   

    那我的时间是不是这样 第一个数据出现在txt文本中时,时间已经过了5000ms?是否?
      

  13.   

    第一个数据出现在txt文本中时,离程序开始运行最短为100MS
    设置Timer1.Interval = 100,则每100MS采集1次秤数据.
      

  14.   

    看看我之前给人家回复的,问题一样:
    LZ提醒你下 最好别用USB转串口的通信方式 最好是直接电路上的9针对台式机后的9针(其实只要3针就可以,2-2,3-3,5-5) 
    为什么呢?因为转下,如果数据发送接收过快,容易丢失,以致你的VB程序死掉,都是有可能的,吾的亲身体会! 
    至于怎么发送,给你个例子(这是发送AA AA FF 06 31 0 0 0 FF, 
    格式: 
    标志字节(帧首)  +  命令字节 + 数据参数字节    +    帧尾字节 
            2字节        2字节        4字节            1字节 Private Sub Form_Load()
        MSComm1.CommPort = port
        MSComm1.Settings = setting
    End Sub
    Private Sub Command1_Click()
              Dim lngP As long
              Dim buff_out10() As Byte
              ReDim buff_out10(8)
              MSComm1.Settings = "9600,N,8,1"   ' 9600 波特,无奇偶校验,8 位数据,一个停止位。
              MSComm1.InputLen = 0
              If MSComm1.PortOpen = False Then
                 MSComm1.PortOpen = True
              End If
              buff_out10(0) = &HAA
              buff_out10(1) = &HAA
              buff_out10(2) = &HFF
              buff_out10(3) = &H6
              buff_out10(4) = &H31
              buff_out10(5) = &H0
              buff_out10(6) = &H0
              buff_out10(7) = &H0
              buff_out10(8) = &HFF
              MSComm1.Output = buff_out10
              lngP = GetTickCount    'API函数
              Do
                     DoEvents
              Loop Until GetTickCount - lngP > 100 Or MSComm1.InBufferCount > 10 '当等待时间超过100毫秒或串口接受缓冲区的数据达到10个字节时退出等待循环,这就是一个通信等待的过程。
              DoEvents
    End Sub
      

  15.   

     保存到TXT文本中是这样的
      +0.00  GS   +69.17  G   +69.16  GS   +69.17  GS 
    处理数据的时候很不方便,能不能把GS不要保存到文本中
    而且把换行符去掉,只回车换行就可以了
    不然空一行处理数据还得一个一个去掉 实在是太麻烦了
      

  16.   

    LZ:自己应该动点脑筋,对代码作修改去除回车换行,改变Mid(strss, 1, Len(strss) - 2)中的数字2,可往前取数据,从而去除数据后不要的部分:
    Private Sub MSComm1_OnComm()
        Select Case MSComm1.CommEvent
            Case comEvReceive
                strss = strss & MSComm1.Input
                If Right(strss, 2) = vbCrLf Then
                    Label1.Caption = strss
                    Open "D:\DATA.txt" For Append As #1
                        Print #1, Mid(strss, 1, Len(strss) - 2) '去除回车换行
                    Close
                    strss = ""
                End If
            End Select
    End Sub
      

  17.   

    Private Sub MSComm1_OnComm()
        Select Case MSComm1.CommEvent
            Case comEvReceive
                strss = strss & MSComm1.Input
                If Right(strss, 2) = vbCrLf Then
                    Label1.Caption = strss
                    Open "D:\DATA.txt" For Append As #1
                        Print #1, Mid(strss, 1, Len(strss) - 6) '去除回车换行
                      Close
                    strss = ""
                End If
            End Select
    End Sub