大家好,近来我在用vb开发一套称重管理程序中遇到了难题, 一早也没做过串口编程,所以现在很棘手。也看了很多少资料,就是搞不明白软件怎么样获取称重仪表的数值。主要有个难题,我对称重仪表的通讯协议有点不解,我知道采用连续发送方式,可是我总是写出来的代码很不稳定,容易报错。另外我不知道怎么才可以把一个软件可以与许多仪表才能配接。如有那位朋友了解,熟悉,请不吝赐教,在这里我先谢谢啦!

解决方案 »

  1.   


    最好能问称重仪厂家要个VB的DEMO
      

  2.   

    用MSCOMM做,很容易的
    设置好波特率
    再写个响应处理函数即可
      

  3.   


    不好意思各位,近两天有点事情没有在家,所以在这里向大家说不是,望大家原谅。
    我实际上想做一个可以配接各种仪表的一个软件,但是我现在一个都没有通过,那就先说一个仪表,把一个仪表拿下再说好啦!通讯协议如下:
    XK3190-A9 仪表具有RS232 串行通讯接口,可与计算机进行通讯。
    1. 通讯接口采用15 芯插头座(与大屏幕共用),其引脚定义见图2--5 中6、7、8 脚。
    2. 通讯接口采用RS232C,所有数据均为ASCII 码,每组数据有10 位组成,第1 位为起始位,第10位为停止位,中间8 位为数据位。通讯方式分为:
    (1). 连续方式:
    所传送的数据为仪表显示的当前称量(毛重或净重)。每帧数据由12 组数据组成 。格式如下:
    第X 字节 内 容 及 注 解
    1 02(XON) 开始
    2 +或- 符号位
    3 称量数据 高位
    : 称量数据 :
    : 称量数据 :
    8 称量数据 低位
    9 小数点位数 从右到左(0~4)
    10 异或校验 高四位
    11 异或校验 低四位
    12 03(X0FF) 结束
    异或=2⊕3⊕……8⊕9
      

  4.   

    建立一个工程,把全部代码拷入,即可测试。
    Private Sub Command1_Click()
    Text1.Text = ""
    Text3.Text = ""
    Label1.Caption = "动 态"
    Label1.ForeColor = &HFF&
    Timer1.Enabled = True
    Timer3.Enabled = TrueEnd SubPrivate Sub Form_Load()
    MSComm1.CommPort = 1
    MSComm1.PortOpen = TrueEnd SubPrivate Sub Timer1_Timer()
    Dim buffer1, buffer2, buffer3'buffer2用于保存缓冲区的数据
    buffer2 = MSComm1.Input
    buffer1 = " "
    '查找存缓冲区的数据是否有空格出现因为空格后的数据为有用数据
    buffer3 = InStr(buffer2, buffer1)
    If buffer3 = 0 Then
    Exit Sub
    Else
    'buffer3为空格出现的位置,加一后取6个长度就是称的读数
    buffer3 = buffer3 + 1
    Text1.Text = Mid(buffer2, buffer3, 6)
    End If
    End Sub
    Private Sub Timer2_Timer()
    Dim buffer1, buffer2, buffer3
    buffer2 = MSComm1.Input
    buffer1 = " "
    buffer3 = InStr(buffer2, buffer1)
    If buffer3 = 0 Then
    Exit Sub
    Else
    buffer3 = buffer3 + 1
    Text2.Text = Mid(buffer2, buffer3, 6)
    End If
    End SubPrivate Sub Timer3_Timer()
    Dim buffer1, buffer2, buffer3
    buffer2 = MSComm1.Input
    buffer1 = " "
    buffer3 = InStr(buffer2, buffer1)
    If buffer3 = 0 Then
    Exit Sub
    Else
    buffer3 = buffer3 + 1
    Text3.Text = Mid(buffer2, buffer3, 6)
    If Text1.Text = Text3.Text Then
    Timer1.Enabled = False
    Timer2.Enabled = False
    Timer3.Enabled = False
    Label1.Caption = "稳 态"
    Label1.ForeColor = &HFF00&
    End If
    End If
    End Sub
      

  5.   

    http://download.csdn.net/source/1262066这是一个串口调试器的代码,你下载来单步调试一下。
      

  6.   

    我做过金钟衡器的电子称重,分析一下MSCOMM控件获取到的实时数据,再对照协议看看数据的含义,不难实现。
      

  7.   

    我现在都在做仪表的通讯程序,看了一下你的情况,顺便查了一下这个仪表的通讯协议,试写如下代码:Dim getData As StringPrivate Sub Command1_Click()
     MSComm1.PortOpen = True '打开串口,开始接收
     End SubPrivate Sub Form_Load()
     MSComm1.CommPort = 1 '计算机的端口号,你当前使用COM几
     MSComm1.InBufferCount = 0 '接收缓冲初始
     MSComm1.Settings = "9600,n,8,1" '在仪表调成波特率9600,8位数据,1位停止,无校验
      
     Timer1.Enabled = True
     Timer1.Interval = 300 '500ms读一次可以更小,但不要小于50
     
     Text1.Text = Text1.Text & getData & vbLf & vbCr
     
    End SubPrivate Sub Timer1_Timer()
     Dim rcv As String
     rcv = MSComm1.Input
     If Len(rvc) >= 12 Then
       If Not InStr(rcv, Chr(3)) Or Not InStr(rcv, Chr(2)) Then Exit Sub '数据不完整,不要
       
       rcv = Right(rcv, Len(rcv) - InStr(rcvc, Chr(2)) - 1)
       rcv = Left(InStr(rcv, Chr(3)) - 1)
       rcv = Left(Len(rcv) - 2)
       
     Else
       Exit Sub  '数据不完整,不要
     End If
        
     getData = rcv
    End Sub这里变量getdata 应该就是你要的称重数据.可以用到其它运算中去了.看看TEXT1文本有没?因为没有实际的仪表调试,不敢说这些代码就能正常,给你参考一下吧:)
      

  8.   

    噢,再提下,上面代码将MSComm1.PortOpen = True 与 Timer1.Enabled = True交换一下位置,更合理