我的时间控件程序: 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
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.读和显示尽量分离,读的程序只管读,显示的程序只管显示,很多时候数据采集的要求是越快越好,而不是时间上的等间隔。显示处理什么的包含在同一代码中,会使代码显得杂乱和调试困难,尽量分离。
如果有这句: Temp=(Temp+1) Mod 2 那Temp的值只有0或1了。 这样,Select就没必要了,就用If……Else……就行; 并且 Temp=(Temp+1) Mod 2 的运行效率也“低了”,就用 Temp = 1 Xor Temp 就行。 或者在If…Else…的分支中分别直接赋值1和0。
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
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.读和显示尽量分离,读的程序只管读,显示的程序只管显示,很多时候数据采集的要求是越快越好,而不是时间上的等间隔。显示处理什么的包含在同一代码中,会使代码显得杂乱和调试困难,尽量分离。
那Temp的值只有0或1了。
这样,Select就没必要了,就用If……Else……就行;
并且 Temp=(Temp+1) Mod 2 的运行效率也“低了”,就用 Temp = 1 Xor Temp 就行。
或者在If…Else…的分支中分别直接赋值1和0。
不过其实多路采集使用任务式会更好,优先级分配,故障设备自动调级