在SerialPort的DataReceived中啟動Timer
這個問題是在做RS232讀取時常會發生的想要呼叫其他UI項目的情形,小舖有人問這個問題,問題如下
以前都是用VB6在寫程式,可以在mscomm的comEvReceive設定Timer的啟動或是關閉
目前用VS 2005的VB.NET的SerialPort DataReceived來接收資料後判斷都無問題,
但遇到資料符合條件時要設定TIMER.Enabled或是TIMER.Start(),寫在TIMER_Tick的程式碼都不會執行
http://www.blueshop.com.tw/board/show.asp?subcde=BRD20090320161222CNM&fumcde=
其實這個問題在MSDN說明SerialPort.DataReceived 事件的備註,就有寫到此問題的解法 :
http://msdn.microsoft.com/zh-tw/library/system.io.ports.serialport.datareceived.aspx
從 SerialPort 物件收到資料時,會在次要執行緒上引發 DataReceived 事件。由於這個事件是在次要執行緒上引發,而非主執行緒,所以嘗試在主執行緒中修改某些項目 (例如 UI 項目) 可能會引發執行緒例外狀況。如果必須在主要 Form 或 Control 中修改項目,請使用 Invoke 回傳變更要求,此方法將會針對適當的執行緒執行此作業。所以只要透過 Invoke 來回傳變更要求就可以了,以下為針對此問題的程式碼
Private Sub AddRecieve(ByVal sender As System.Object, ByVal e As System.EventArgs)
Timer1.Interval = 1000
Timer1.Start()
End Sub
Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
Me.Invoke(New EventHandler(AddressOf AddRecieve))
End Sub
Timer1.Interval = 1000
Timer1.Start()
End Sub
Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
Me.Invoke(New EventHandler(AddressOf AddRecieve))
End Sub