我在编写vb程序读取两个总线连接的RS485接口传感器数据,如何能够等间隔交替读取?
我通过timer控件,为什么读取两个传感器的间隔时间不一样,读第一个正常,读第二个就是慢,大约3倍时间。
求大神解决。

解决方案 »

  1.   

    我的时间控件程序:
    Private Sub Timer4_Timer()
    temp = temp + 1
    If temp = 1 Then
    t2.Text = ""
    Call hexSend1
    End If
    If temp = 2 Then
    t4.Text = ""
    Call hexSend2
    End If
    If temp > 2 Then temp = 0
    End If
    End Sub
      

  2.   


    Private Sub Timer4_Timer()
      Static Temp As Integer
      Timer4.Enabled = False
      Select Case Temp
        Case 0
          t2.Text = ""
          Call hexSend1
        Case 1
          t4.Text = ""
          Call hexSend2
        Case Else
          '.....
      End Select
      Temp=(Temp+1) Mod 2
      Timer4.Enabled = True
    End Sub1.Timer4_Timer事件函数的执行时间可能超过Timer4.Interval的间隔时间,所以起始用Enabled中断一下,这样时间分隔更均匀一些
    2.数据回读你是在OnComm事件中的,还是在HexSend函数里做的,OnComm事件中做的话,可能有触发条件设置的问题,比如MSComm控件RThreshold值的取值设置问题,另外还有数据粘包的情况,比如两次send但是数据是一次性读到了两个数据包,结果只解析了一个数据,产生丢失。
    3.读和显示尽量分离,读的程序只管读,显示的程序只管显示,很多时候数据采集的要求是越快越好,而不是时间上的等间隔。显示处理什么的包含在同一代码中,会使代码显得杂乱和调试困难,尽量分离。
      

  3.   

    如果有这句: Temp=(Temp+1) Mod 2
    那Temp的值只有0或1了。
    这样,Select就没必要了,就用If……Else……就行;
      并且 Temp=(Temp+1) Mod 2 的运行效率也“低了”,就用 Temp = 1 Xor Temp 就行。
      或者在If…Else…的分支中分别直接赋值1和0。
      

  4.   

    那样子,扩展性就没有了,多路采集的时候只要把2改一下,加几个case 就完事了。
    不过其实多路采集使用任务式会更好,优先级分配,故障设备自动调级
      

  5.   

    既然是通过RS485传递数据,可以在MsComm控件的OnComm事件中读入数据,然后按数据地址号来区分。