SerialPort.DataReceived事件未触发

时间:2014-11-23 18:20:04

标签: vb.net event-handling serial-port

我已经将SerialPort对象定义如下:

Public WithEvents SerialComm As New System.IO.Ports.SerialPort

SerialComm在对象构造函数中设置并打开,并在处理对象时关闭。我的处理程序签名如下:

Private Sub OnComm(sender as Object, e as SerialDataReceivedEventArgs) Handles SerialComm.DataReceived

我正在尝试从HyperTerminal获取DataReceived事件。发送一些数据后,我可以设置断点并检查SerialComm.BytesToRead的值,看看它是否已更新为正确的字节数。

我已确认SerialPort已打开并正在接收数据,但我无法触发该事件。

我还尝试使用AddHandler手动连接事件(在删除WithEvents定义之后),但我仍然无法触发事件。

我错过了什么?

更新

这是我遇到麻烦的课程:

Imports System.IO.Ports

Public Class CopyCat
    Implements IDisposable

    Private RxString As String        
    Private LastReceiveTime As DateTime
    Public WithEvents SerialComm As New SerialPort

    Public Property Timeout As TimeSpan

    Public Sub New(commPort As String, timeout As TimeSpan)
        Me.Timeout = timeout
        Enable(commPort)
    End Sub

    Public Sub New(commPort As String)
        Me.New(commPort, TimeSpan.FromMilliseconds(1000))
    End Sub

    Public Sub Enable()
        CommUtilities.SetupComm(SerialComm, commPort, 115200, 8, Parity.Odd, StopBits.One, Handshake.None, System.Text.Encoding.Default)
    End Sub

    Public Sub Disable()
        SerialComm.Close()
    End Sub

    Private Sub OnComm(sender As Object, e As SerialDataReceivedEventArgs) Handles SerialComm.DataReceived
        If(DateTime.Now - LastReceivedTime > Timeout) Then RxString = ""

        Do While(SerialComm.BytesToRead > 0)
            Dim readChar As String
            Dim termChar As Char = Chr(RxString.ToByteList().XorAll())
            readChar = SerialComm.ReadChar

            RxString &= readChar
            if (readChar = termChar) Then
                SerialComm.Write((From item In GetResponse(RxString).Build()
                                    Select item.Data).ToRawString)
                RxString = ""
            End If
        Loop
    End Sub

    Public Function GetResponse(commandString As String) As MessageResponse
        Dim response As MessageResponse = MessageResponse.GetMessageResponseFromByteList(commandString.ToByteList())

        if (response.GetType = GetType(GetStatusResponse)) Then
            response.DataBytes(8).Data = Math.Floor(Rnd() * 255)
            response.DataBytes(9).Data = Math.Floor(Rnd() * 255)
        End If

        Return response
    End Function

    Private disposedValue as Boolean

    Protected Overridable Sub Dispose(disposing As Boolean)
        If Not Me.disposedValue Then
            If disposing Then
                SerialComm.Dispose()
            End If
        End If
        Me.disposedValue = True
    End Sub

    Public Sub Dispose() Implements IDisposable.Dispose
        Dispose(True)
        GC.SuppressFinalize(Me)
    End Sub

End Class

0 个答案:

没有答案