上位扫描下位机,我的理解是,上位机发出一个命令,下位机返回来。然后自动显示在combo里面。用的是MODBUS协议
想法一:那就加个定时器,假如在1S后没数据就表示没设备,如果有数据返回,在combo里面显示“仪表1”“仪表2”……
想法二:编个waitrs()程序,如果收不到结尾值并且超时则执行下面的程序,不在继续等待下去
高手帮忙一下吧,实在是编不出来

解决方案 »

  1.   

    Private Sub Timer_SCAN_Timer()      '每500ms中断一次
        Dim count As Integer
        Dim send(7) As Byte         '定义发送数组
        Dim crc(2) As Byte
        
        If scanaddP < 31 Then
            send(0) = scanaddP
            scanaddP = scanaddP + 1
            Else: scanaddP = 0
        End If
        
        send(1) = &H3
        send(2) = &H0
        send(3) = &H0
        send(4) = &H0
        send(5) = &HA
        Call CRC16(send(), 5, crc())
        send(6) = crc(1)
        send(7) = crc(0)
        
        MSComm.Output = send
    End Sub关于对仪表的测试,我写了个程序。模拟串口也确实收到了。对于接收。想写和以上类似的程序,不会写了。555~请高人指点。
    Private Sub Timer_Add_Timer()
        Dim receive(7) As Byte     '定义接收数组
        
        
        
        
        Combo_Meter.AddItem
    End Sub
      

  2.   

    用MSComm1,现提供点程序供参考。'------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    '4118采样值读入
    '--------------------------------------------------------------------------------Function Read4118(ComStrb As String, delaytime As Single) As Single
    Dim valuestr As String
    Dim WZstart As Integer
    Dim WZend As Integer
    Dim i As Integer
    On Error GoTo cwzydz
        Read4118 = 0
        For i = 1 To Len(ComStrb)
            cyzb = cyzb + Asc(Mid$(ComStrb, i, 1))
        Next
        cyzb = cyzb And &HFF
        ComStrb = ComStrb + Hex$(cyzb) + Chr$(13)
        InitCom
        Com.MSComm1.Output = ComStrb
        delay (delaytime)
        valuestr = Com.MSComm1.Input
        valuestr = Trim$(valuestr)
        If (Left$(valuestr, 1) <> ">") And (Right(valuestr, 1) <> Chr$(13)) Then
                Exit Function
        Else
                WZstart = InStr(1, valuestr, ">")
                WZend = InStr(1, valuestr, Chr$(13))
                If (WZstart > 0) And (WZend > 0) Then
                        If WZstart <> WZend Then
                            Read4118 = (Mid$(valuestr, WZstart + 1, WZend - 4))
                        Else
                            Read4118 = 0
                        End If
                End If
        End If
    cwzydz:
    End Function