我在撰寫vb程式讀取兩個總線連接的RS485介面傳感器資料,如何能夠等間隔交替讀取?
我通過timer控制元件,為什么讀取兩個傳感器的間隔時間不一樣,讀第一個正常,讀第二個就是慢,大約3倍時間。
求大神解決。
uj5u.com熱心網友回復:
我的時間控制元件程式: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
uj5u.com熱心網友回復:
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 Sub
1.Timer4_Timer事件函式的執行時間可能超過Timer4.Interval的間隔時間,所以起始用Enabled中斷一下,這樣時間分隔更均勻一些
2.資料回讀你是在OnComm事件中的,還是在HexSend函式里做的,OnComm事件中做的話,可能有觸發條件設定的問題,比如MSComm控制元件RThreshold值的取值設定問題,另外還有資料粘包的情況,比如兩次send但是資料是一次性讀到了兩個資料包,結果只決議了一個資料,產生丟失。
3.讀和顯示盡量分離,讀的程式只管讀,顯示的程式只管顯示,很多時候資料采集的要求是越快越好,而不是時間上的等間隔。顯示處理什么的包含在同一代碼中,會使代碼顯得雜亂和除錯困難,盡量分離。
uj5u.com熱心網友回復:
如果有這句: Temp=(Temp+1) Mod 2那Temp的值只有0或1了。
這樣,Select就沒必要了,就用If……Else……就行;
并且 Temp=(Temp+1) Mod 2 的運行效率也“低了”,就用 Temp = 1 Xor Temp 就行。
或者在If…Else…的分支中分別直接賦值1和0。
uj5u.com熱心網友回復:
那樣子,擴展性就沒有了,多路采集的時候只要把2改一下,加幾個case 就完事了。
不過其實多路采集使用任務式會更好,優先級分配,故障設備自動調級
uj5u.com熱心網友回復:
既然是通過RS485傳遞資料,可以在MsComm控制元件的OnComm事件中讀入資料,然后按資料地址號來區分。轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/48528.html
標籤:控件
上一篇:求教高手,在線等
下一篇:新手請教一段代碼
