none
Handles 子句需要 WithEvents 變數,該變數定義於包含型別或它的一種基底型別中<<自定SerialPort的錯誤 RRS feed

  • 問題

  • 我在模組產生一個serialport

     '-----------------------

       Public Ser_GPS, Ser_LS As New IO.Ports.SerialPort

    '------------------------

     

    在FORm中

    '------------------------

        Private Sub ser_gps_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles Ser_GPS.DataReceived

            txt_gps_stream.Invoke(New myDelegate(AddressOf updateTextBox), New Object() {})

        End Sub


        Public Delegate Sub myDelegate()

        Public Sub updateTextBox()
            With txt_gps_stream
              
                .Text = (Ser_GPS.ReadExisting)

            End With
        End Sub

    '--------------------------

    portname以及baudrate都有正確設定。

     

    但在編輯階段,Handles下面就會被標底線,說

    【Handles 子句需要 WithEvents 變數,該變數定義於包含型別或它的一種基底型別中】

    請問各位學長,這個部份我要如何修正?

     

    2008年5月5日 上午 06:16

解答

  • HI,

     

    請將這一行:

     

    Public Ser_GPS, Ser_LS As New IO.Ports.SerialPort

     

    改成:

     

    Public WithEvents Ser_GPS, Ser_LS As New IO.Ports.SerialPort

     

    即可

     

    tihs

    2008年5月5日 上午 07:03
  • Hi,

    有兩種方式,一種如tihs大所說,我測試是不會有問題哩

    Code Snippet

    Dim WithEvents Q, J As New IO.Ports.SerialPort

        Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles J.DataReceived, Q.DataReceived
            ''接收資料相關處理
        End Sub

     

     

    另一種是用addhandler的方式,會像下面這樣

    Code Snippet

    Dim P As IO.Ports.SerialPort

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            P = New IO.Ports.SerialPort
            AddHandler P.DataReceived, AddressOf SerialPort1_DataReceived
        End Sub

        Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs)
            ''接收資料相關處理
        End Sub

     

     

    2008年5月5日 上午 07:43
    版主

所有回覆

  • HI,

     

    請將這一行:

     

    Public Ser_GPS, Ser_LS As New IO.Ports.SerialPort

     

    改成:

     

    Public WithEvents Ser_GPS, Ser_LS As New IO.Ports.SerialPort

     

    即可

     

    tihs

    2008年5月5日 上午 07:03
  • 報告學長,問題還是存在

    2008年5月5日 上午 07:36
  • Hi,

    有兩種方式,一種如tihs大所說,我測試是不會有問題哩

    Code Snippet

    Dim WithEvents Q, J As New IO.Ports.SerialPort

        Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles J.DataReceived, Q.DataReceived
            ''接收資料相關處理
        End Sub

     

     

    另一種是用addhandler的方式,會像下面這樣

    Code Snippet

    Dim P As IO.Ports.SerialPort

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            P = New IO.Ports.SerialPort
            AddHandler P.DataReceived, AddressOf SerialPort1_DataReceived
        End Sub

        Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs)
            ''接收資料相關處理
        End Sub

     

     

    2008年5月5日 上午 07:43
    版主
  • to Bauann學長

    您的方法是可行的,但是我的serialport是在模組中宣告,所以會有這個問題

    請問要如何解決?

    我是想要serialport 可以跨form使用,所以在模組中宣告。

    2008年5月5日 上午 07:57
  • Hi,

    要跨Form使用同時又要用到DataReceived這個事件這樣比較麻煩,我目前想到的是要動態的去做addhandler跟removehandler,不過這樣有點煩就是了,或者是每個form裡面都有一個,用完就關掉,讓別的form也能夠操作這個Port,參考看看。

    2008年5月5日 上午 08:30
    版主
  •  

    Private Sub frm_setup_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load

    AddHandler Ser_GPS.DataReceived, AddressOf ser_gps_DataReceived

    End Sub

     

    Private Sub ser_gps_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs)

            txt_gps_stream.Invoke(New myDelegate(AddressOf updateTextBox), New Object() {})

    End Sub

    Public Delegate Sub myDelegate()

    Public Sub updateTextBox()
            With txt_gps_stream
              
                .Text = (Ser_GPS.ReadExisting)

            End With
    End Sub

     

    ---------------------------------------------------------------------------------------------

    我改成這樣,serialport 同樣在模組宣告

     

    在編輯時不會被加上底線標注錯誤,但是執行時似乎沒有觸發 datareceived 事件

    也就是說,仍無法取得serial port傳進來的資料

     

    請學長幫忙看看哪裡錯了

     

    2008年5月6日 上午 01:10
  • Hi,

    可以確認一下相關屬性設定有沒有正確,像是ReceivedBytesThreshold,這個屬性是設定收到多少個byte之後要引發DataReceived事件;其他還有PortName、Baudrate等相關設定;板上之前有一些GPS相關的討論,可以一起參考一下

    http://forums.microsoft.com/MSDN-CHT/Search/Search.aspx?words=gps&localechoice=31748&SiteID=14&searchscope=forumscope&ForumID=803

     

    2008年5月6日 上午 01:45
    版主