[VB.NET]在SerialPort的DataReceived中啟動Timer

  • 60957
  • 0
  • 2010-08-02

在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