我要对一台汽车衡进行数据采集,规格为HT9800-W秤重显示控制器,是杭州衡天电子有限公司生产的其说明书介绍如下:
数据格式连续发送一组数据,每组数据5帧,每帧11位:
1位起始位(0),
8位数据位(D0-D7),
2位停止位(1)。
起定义如下:
第1帧:D0-D7 0FFH(起始位) 
第2帧:D0-D2 为小数点位置(0-4) D3 NC D4 1表示称重稳定 0表示称重未稳定 D5 1表示称重为负 0表示称重未稳正 D6 NC D7 1表示溢出
第3帧:D0-D7 BCD1(称重值) 
第4帧:D0-D7 BCD2(称重值) 
第5帧:D0-D7 BCD3(称重值) 注:(1)BCD1、BCD2、BCD3为由高到低的称重值的NCD码。
由于没有搞过串口,不知如何才能得到正确的数据,请各位给写一个函数,
在窗体上LABEL1显示电子称当前传来的数据,这时可能数据不稳定,真到数据稳定时Command1.enable=true,然后单击按钮LABEL2,显示当前的电子磅数据。
谢谢了!分不够,可能另加。

解决方案 »

  1.   

    with comm1  
    time1 = Now()
            s = .Input        Do While .inputcount = 0 And DateDiff("s", time1, Now()) < 5
                DoEvents
                Sleep (2000)
                s = s & .Input
            Loop        s = s & .Input
    end with注意,配置好comm,这是从串口读书据,不知道你想做成什么样的,可以自己修改,或做成函数。
      

  2.   

    其说明书介绍如下:
    数据格式连续发送一组数据,每组数据5帧,每帧11位:
    1位起始位(0),
    8位数据位(D0-D7),
    2位停止位(1)。
    起定义如下:
    第1帧:D0-D7 0FFH(起始位) 
    第2帧:D0-D2 为小数点位置(0-4) D3 NC D4 1表示称重稳定 0表示称重未稳定 D5 1表示称重为负 0表示称重未稳正 D6 NC D7 1表示溢出
    第3帧:D0-D7 BCD1(称重值) 
    第4帧:D0-D7 BCD2(称重值) 
    第5帧:D0-D7 BCD3(称重值) 注:(1)BCD1、BCD2、BCD3为由高到低的称重值的NCD码。
    _______________________________________
    还要知道串口的通讯速率、校验方式及数据传输方式(由上面可知应为二进制形式)
    可以用MScomm控件把RThreshold属性设为1,让缓冲区收到一个字节数据就产生一次OnComm事件,然后在OnComm事件中进行数据接收。如下:
    Option ExplicitPrivate Sub Form_Load()
        Me.MSComm1.CommPort = 1    '端口号
        Me.MSComm1.RThreshold = 1  '在 MSComm 控件设置 CommEvent 属性为 comEvReceive 并产生 OnComm 之前,设置并返回的要接收的字符数。
        Me.MSComm1.InputLen = 1    '设置并返回 Input 属性从接收缓冲区读取的字符数。
        Me.MSComm1.InputMode = comInputModeBinary     '通过 Input 属性以二进制方式检取回数据
        Me.MSComm1.Settings = "9600,o,8,1"   '设置并返回波特率、奇偶校验、数据位、停止位参数。
        Me.MSComm1.PortOpen = True
    End SubPrivate Sub MSComm1_OnComm()
        Dim fr As Variant
        Dim d(0) As Byte
        Select Case Me.MSComm1.CommEvent
           Case comEvReceive
           '接收
                fr = Me.MSComm1.Input
                d(0) = fr(0)
                'd(0)为接收到的第一个字节的数据,后面就是你的处理代码啦。
                ......
           
        End SelectEnd Sub
      

  3.   

    这是我的一个示例,你参考一下:
    源码地址:http://blog.csdn.net/yefanqiu  【叶帆源码】[009]串口通信示例
    '*************************************************************************
    '**模 块 名:frmMain
    '**说    明:YFHome 版权所有2004 - 2005(C)
    '**创 建 人:叶帆
    '**日    期:2004-09-19
    '**修 改 人:
    '**日    期:
    '**描    述:串口通信示例(CSDN 开源)
    '**        :-------------------------------------------------------
    '**        :示例说明
    '**        :
    '**        :该示例程序模拟PC机与一终端(下位机)串口通信,PC机先向下位机发送五个字节,下位机
    '**        :收到数据后也返回送五个字节的确认命令
    '**        :
    '**        :         字头  站号  副本  命令  副本
    '**        :帧 结 构:AC    01    01    0A    0A           正副本校验方式
    '**        :
    '**        :返 回 帧:AC    01    01    AA    AA           响应命令,表示终端接收到数据
    '**        :-------------------------------------------------------
    '**版    本:V1.0.0
    '*************************************************************************
    Option Explicit
    Private Declare Function GetCurrentTime Lib "kernel32" Alias "GetTickCount" () As Long'*************************************************************************
    '**函 数 名:cmdSend_Click
    '**输    入:无
    '**输    出:无
    '**功能描述:发送命令
    '**全局变量:
    '**调用模块:
    '**作    者:叶帆
    '**日    期:2004-09-19
    '**修 改 人:
    '**日    期:
    '**版    本:V1.0.0
    '*************************************************************************
    Private Sub cmdSend_Click()
      Dim bytData(10) As Byte
      bytData(0) = &HA                           '数据
      txtMsg.Text = SendData(1, bytData, 1)      '发送命令
    End Sub'*************************************************************************
    '**函 数 名:Form_Load
    '**输    入:无
    '**输    出:无
    '**功能描述:串口初始化
    '**全局变量:
    '**调用模块:
    '**作    者:叶帆
    '**日    期:2004-09-19
    '**修 改 人:
    '**日    期:
    '**版    本:V1.0.0
    '*************************************************************************
    Private Sub Form_Load()
       OpenPort 1            '打开串口
    End Sub'*************************************************************************
    '**函 数 名:OpenPort
    '**输    入:PortNo(Integer)                       - 串口号 1,2,3...
    '**        :Optional InBufferSize(Integer = 1024) - 接收缓冲区  默认为1024个字节
    '**        :Optional OutBufferSize(Integer = 512) - 发送缓冲区  默认为512个字节
    '**输    出:0 打开串口成功 1 打开串口失败
    '**功能描述:打开串口
    '**全局变量:
    '**调用模块:
    '**作    者:叶帆
    '**日    期:2003年12月17日
    '**修 改 人:
    '**日    期:
    '**版    本:V1.0
    '*************************************************************************
    Public Function OpenPort(PortNo As Integer, Optional InBufferSize As Integer = 1024, Optional OutBufferSize As Integer = 512) As Long
       On Error GoTo ErrExit
        MSComm1.CommPort = PortNo                   '采用COM端口
        MSComm1.Settings = "9600,n,8,1"
        MSComm1.InputMode = comInputModeBinary      '采用二进制传输
        MSComm1.NullDiscard = False                 'NULL字符从端口传送到接受缓冲区
        MSComm1.DTREnable = False                   'DTR线无效
        MSComm1.EOFEnable = False                   '不寻找EOF符
        MSComm1.RTSEnable = False                   'RTS线无效
        MSComm1.InBufferCount = 0                   '清空接受缓冲区
        MSComm1.OutBufferCount = 0                  '清空传输缓冲区
        MSComm1.SThreshold = 1                      '如果传输缓冲区完全空时产生MSComm事件
        MSComm1.RThreshold = 0                      '不产生MSComm事件
        MSComm1.InBufferSize = InBufferSize         '接收缓冲区  默认为1024个字节
        MSComm1.OutBufferSize = OutBufferSize       '发送缓冲区  默认为512个字节
        MSComm1.PortOpen = True                     '打开端口
        OpenPort = 0
       Exit Function
    ErrExit:
       OpenPort = 1
    End Function
      

  4.   

    '*************************************************************************
    '**函 数 名:ClosePort
    '**输    入:无
    '**输    出:无
    '**功能描述:关闭串口
    '**全局变量:
    '**调用模块:
    '**作    者:叶帆
    '**日    期:2003年12月15日
    '**修 改 人:
    '**日    期:
    '**版    本:V1.0
    '*************************************************************************
    Public Sub ClosePort()
       On Error GoTo ErrExit
         MSComm1.PortOpen = False                      '关闭端口
       Exit Sub
    ErrExit:
       
    End Sub'*************************************************************************
    '**函 数 名:SendData
    '**输    入:bytAddr(Byte)   - 设备地址(0~255)
    '**        :bytData()(byte) - 数据数组
    '**        :bytNum(byte)    - 数据个数(1~256/数据类型的长度)
    '**输    出:(Long) - 0 成功 1 -超时  2 - 接收的数据有误  3 - 其它未知错误
    '**功能描述:发送数据
    '**全局变量:
    '**调用模块:
    '**作    者:叶帆
    '**日    期:2004年05月19日
    '**修 改 人:
    '**日    期:
    '**版    本:V1.0
    '*************************************************************************
    Public Function SendData(bytAddr As Byte, bytData() As Byte, Optional bytNum As Byte = 1) As Long
        On Error GoTo ErrExit    Dim bytSendArray() As Byte                     '发送数据缓冲区
        Dim intGetDataLen As Integer                   '要接收的数据长度
        Dim sngTimeSpace As Single                     '延时时间
        Dim sngTime As Single
        Dim bytReceiveArray() As Byte                  '接收的数据
        Dim VarReceiveData As Variant                  '接收的变体数据    Dim i As Long    ReDim bytSendArray(0 To bytNum * 2 + 2) As Byte  '发送数据缓冲区    bytSendArray(0) = &HAC                         '同步字头
        bytSendArray(1) = bytAddr                      '下位机地址
        bytSendArray(2) = bytAddr                      '副本    '数据
        For i = 0 To bytNum * 2 - 1 Step 2
            bytSendArray(i + 3) = bytData(i / 2)
            bytSendArray(i + 4) = bytData(i / 2)
        Next    '=====================================================================================
        '信息发送
        '=====================================================================================
        MSComm1.InBufferCount = 0                      '清空接收缓冲区
        MSComm1.Output = bytSendArray                  '发送数据    Do
            DoEvents
        Loop Until MSComm1.OutBufferCount = 0          '等待,直到数据发送完毕    '=====================================================================================
        '信息接收
        '=====================================================================================    '设定要接收的数据长度
        intGetDataLen = 5    '超时时间计算:字节数×每个字节的传输时间×10             9600为波特率 请根据实际设定
        sngTimeSpace = intGetDataLen * (11000# / 9600#) * 10#    sngTime = GetCurrentTime()                          '    Do While True                                  '数据接收        DoEvents
            If MSComm1.InBufferCount >= intGetDataLen Then Exit Do        '超时处理
            If Abs(GetCurrentTime() - sngTime) > sngTimeSpace Then    '超时
                SendData = 1
                Exit Function
            End If    Loop    VarReceiveData = MSComm1.Input
        bytReceiveArray = VarReceiveData    '返回帧校验
        SendData = 2                        '先赋值接收的数据错误
        If bytReceiveArray(0) = &HAC Then   '字头
            '帧数据是否正确(正副本校验)
            If bytReceiveArray(1) = bytReceiveArray(2) And bytReceiveArray(3) = bytReceiveArray(4) Then
                '站号,命令判断
                If bytReceiveArray(1) = bytSendArray(1) And bytReceiveArray(3) = &HAA Then
                    SendData = 0                '命令正确
                End If
            End If
        End IfExit FunctionErrExit:
        SendData = 3
    End Function'*************************************************************************
    '**函 数 名:Form_Unload
    '**输    入:Cancel(Integer) -
    '**输    出:无
    '**功能描述:结束处理
    '**全局变量:
    '**调用模块:
    '**作    者:叶帆
    '**日    期:2004-09-19
    '**修 改 人:
    '**日    期:
    '**版    本:V1.0.0
    '*************************************************************************
    Private Sub Form_Unload(Cancel As Integer)
       ClosePort  '关闭串口
    End Sub
      

  5.   

    第一:波特率应该要说明(9600?)
       起始位 1位,数据位8位,停止位2位(这个比较特殊,一般是一位) <- 这是串口配置参数第二:应该这样表达,每隔一定时间,该仪器自动发送一帧数据
    一帧数据,包括五个字节(11位数据,是指链路层,对应用层来说,就是一个字节,8个bit)
    第1个字节:&HFF  
    第2个字节:0~2位 为小数位
               3   位 NC (是指未使用)
               4   位 1表示称重稳定 0表示称重未稳定 
               5   位 1表示称重为负 0表示称重未稳定
               6   位 NC (是指未使用)
               7   位 1表示溢出
    第3个字节:称重值 高字节
    第4个字节:称重值 中字节
    第5个字节:称重值 低字节   BCD码的转换,你可以上网搜索相关资料你最好用事件方式接收:
    Private Sub MSComm1_OnComm()    Dim VarReceiveData As Variant        '接收的变体数据    '数据接收
        If MSComm1.CommEvent = comEvReceive And MSComm1.InBufferCount > 0 Then        '-------------------------------
            VarReceiveData = MSComm1.Input
        endifend sub