none
SerialPort.Open Methode - Fehlermeldungen abfragen RRS feed

  • Frage

  • Hallo zusammen,
    mein Beispiel zeigt, wie man beim Öffnen Ausnahmefehler abfängt.
    Das funktioniert soweit.
    Ich hätte jetzt gerne gewusst, wie ich die Fehlercodes in ein value bekomme,
    so dass ich je nach Fehler verzweigen kann mit select ... case ... end select.
    Gruß
    Ellen
    Besteht die Möglichkeit eine Vorschau zu sehen, bevor ich auf den Sende Knopf drücke?
    Beim letzten Mal hats mit dem Code nicht richtig geklappt.

    
    
    
    
    Public Class Form1
        Dim readBuffer As String = ""
        Dim comOpen As Boolean
    
    ' automatisch vom Formdesigner generierter Code:
    '----------------------------------------------------------------------
        Private Sub InitializeComponent()
            Me.SerialPort1 = New System.IO.Ports.SerialPort(Me.components)
        end sub
    
        Friend WithEvents SerialPort1 As System.IO.Ports.SerialPort
    '-----------------------------------------------------------------------
    
    '  eigener Code:
    '-----------------------------------------------------------------------
      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
            ' Geräteparameter setzen
            With SerialPort1
                .PortName = "COM2"
                .BaudRate = 9600
                .Parity = IO.Ports.Parity.None
                .DataBits = 8
                .StopBits = IO.Ports.StopBits.One
                .Handshake = IO.Ports.Handshake.None
                .RtsEnable = False
                .ReceivedBytesThreshold = 30
            End With
    
            ' prüfen, ob Gerät verfügbar ist:
            Try
                SerialPort1.Open()
    
            Catch ex As Exception
                comOpen = False
                MsgBox(ex.Message)
    
            End Try
    
    
            If Not comOpen And SerialPort1.IsOpen Then
                ' Gerät kann verwendet werden
                comOpen = True
            Else
                If (Not comOpen) Then GoTo skip
                comOpen = False
                MsgBox("COM2 nicht geöffnet!")
            End If
    
            skip:
            RxD_buffer.Text = "init"
            TxD_buffer.Text = "init"
    
        End Sub
    
    End Class
    
    
    
    Montag, 19. Oktober 2009 07:21

Antworten

  • Hallon Robert,
    ja selbstverständlich. Entschuldigung.

    Also habe mittlerweile erkannt, daß im Try catch ex meines Beispiels oben die exception genauer spezifziert werden muss.
    Nämlich IO.IOException. Dann werden die Meldungen präziser.- Des weiteren gibt es noch die Möglichkeit mit ex.ToString() zu arbeiten.

    Beides liefert Strings zurück. Damit kann ich leben.

    Dann arbeite noch an der Methode Exception.HResult, um den echten Fehlercode zu . z.B. value = Exception.HResult zu erhalten.
    Danach anschliessend: select case value   .....  case   ....  case ..... end select durchzuführen.
    Das habe ich noch nicht geschafft:

    Ich arbeite noch am DataReceivedError.  Siehe Beispiel. Ich habe in den stream einen Paritätsfehler eingebaut. Die Exception
    reagiert leider nicht auf diesen Fehler, sondern readLine() trägt stattdessen ein ? an die Stelle des fehlerhaften Zeichen ein.
    Es ist wohl garnicht so einfach einen DatareceivedError zu erzeugen.


    Für weitere Hilfe wäre ich sehr dankbar

    Gruß
    Ellen


    Das Zwischenergebnis:

       ' ---------------------------------------------------------------
        ' Windows form aufbauen
        Private Sub Form1_Load(ByVal sender As System.Object, _
                               ByVal e As System.EventArgs) _
                               Handles MyBase.Load
    
            ' Geräteparameter setzen
            With SerialPort1
                .PortName = "COM2"
                .BaudRate = 9600
                .Parity = IO.Ports.Parity.None
                .DataBits = 8
                .StopBits = IO.Ports.StopBits.One
                .Handshake = IO.Ports.Handshake.None
                .RtsEnable = False
                .ReceivedBytesThreshold = 1
            End With
    
            ' prüfen, ob Gerät verfügbar ist:
            Try
                SerialPort1.Open()
                comOpen = SerialPort1.IsOpen
            Catch ex As IO.IOException
                ' Ausnahmefehler abfangen
                comOpen = False
                Meldepuffer = (ex.ToString())
                MsgBox(ex.Message)
            End Try
    
            ' start
      
    
        End Sub
    
     '---------------------------------------------------------------------
        ' thread Daten lesen von COM Port
        Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, _
                                             ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) _
                                             Handles SerialPort1.DataReceived
            If comOpen Then
                Try
                    ' Anzahl der im Empfangspuffer aufgelaufenen Zeichen:
                    Bytenumber = SerialPort1.BytesToRead
                    ' liest 1 Zeichen im Format Byte aus dem Puffer:
                    ByteToRead = SerialPort1.ReadByte()
                    ' liest 1 Byte aus dem Puffer und konvertiert nach Ascii:
                    CharToRead = SerialPort1.ReadChar()
                    ' liest String bis "90" empfangen wird
                    readBuffer1 = SerialPort1.ReadTo("90")
    
                    ' Liest String bis carriage return
                    readBuffer = SerialPort1.ReadLine()
    
                    Me.Invoke(New EventHandler(AddressOf DoUpdate))
                Catch ex As IO.IOException
                    MsgBox(ex.Message)
                End Try
            End If
        End Sub

    Freitag, 23. Oktober 2009 13:27

Alle Antworten

  • Hallo Zusammen,

    ich habe das Problem selber gelöst.
    Danke.

    Gruß
    Ellen
    > beschäftigt sich seit 10 Tagen !! mit VB.NET<


    Mittwoch, 21. Oktober 2009 19:54
  • Hallo Ellen Ramcke,

    Es wäre schön, wenn Du posten würdest wie es funktioniert hat, denn dann profitieren unter Umständen andere mit dem gleichen Problem davon.

    Danke und Grüße,

    Robert

    Mittwoch, 21. Oktober 2009 20:23
    Moderator
  • Hallon Robert,
    ja selbstverständlich. Entschuldigung.

    Also habe mittlerweile erkannt, daß im Try catch ex meines Beispiels oben die exception genauer spezifziert werden muss.
    Nämlich IO.IOException. Dann werden die Meldungen präziser.- Des weiteren gibt es noch die Möglichkeit mit ex.ToString() zu arbeiten.

    Beides liefert Strings zurück. Damit kann ich leben.

    Dann arbeite noch an der Methode Exception.HResult, um den echten Fehlercode zu . z.B. value = Exception.HResult zu erhalten.
    Danach anschliessend: select case value   .....  case   ....  case ..... end select durchzuführen.
    Das habe ich noch nicht geschafft:

    Ich arbeite noch am DataReceivedError.  Siehe Beispiel. Ich habe in den stream einen Paritätsfehler eingebaut. Die Exception
    reagiert leider nicht auf diesen Fehler, sondern readLine() trägt stattdessen ein ? an die Stelle des fehlerhaften Zeichen ein.
    Es ist wohl garnicht so einfach einen DatareceivedError zu erzeugen.


    Für weitere Hilfe wäre ich sehr dankbar

    Gruß
    Ellen


    Das Zwischenergebnis:

       ' ---------------------------------------------------------------
        ' Windows form aufbauen
        Private Sub Form1_Load(ByVal sender As System.Object, _
                               ByVal e As System.EventArgs) _
                               Handles MyBase.Load
    
            ' Geräteparameter setzen
            With SerialPort1
                .PortName = "COM2"
                .BaudRate = 9600
                .Parity = IO.Ports.Parity.None
                .DataBits = 8
                .StopBits = IO.Ports.StopBits.One
                .Handshake = IO.Ports.Handshake.None
                .RtsEnable = False
                .ReceivedBytesThreshold = 1
            End With
    
            ' prüfen, ob Gerät verfügbar ist:
            Try
                SerialPort1.Open()
                comOpen = SerialPort1.IsOpen
            Catch ex As IO.IOException
                ' Ausnahmefehler abfangen
                comOpen = False
                Meldepuffer = (ex.ToString())
                MsgBox(ex.Message)
            End Try
    
            ' start
      
    
        End Sub
    
     '---------------------------------------------------------------------
        ' thread Daten lesen von COM Port
        Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, _
                                             ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) _
                                             Handles SerialPort1.DataReceived
            If comOpen Then
                Try
                    ' Anzahl der im Empfangspuffer aufgelaufenen Zeichen:
                    Bytenumber = SerialPort1.BytesToRead
                    ' liest 1 Zeichen im Format Byte aus dem Puffer:
                    ByteToRead = SerialPort1.ReadByte()
                    ' liest 1 Byte aus dem Puffer und konvertiert nach Ascii:
                    CharToRead = SerialPort1.ReadChar()
                    ' liest String bis "90" empfangen wird
                    readBuffer1 = SerialPort1.ReadTo("90")
    
                    ' Liest String bis carriage return
                    readBuffer = SerialPort1.ReadLine()
    
                    Me.Invoke(New EventHandler(AddressOf DoUpdate))
                Catch ex As IO.IOException
                    MsgBox(ex.Message)
                End Try
            End If
        End Sub

    Freitag, 23. Oktober 2009 13:27
  • Hallo Ellen Ramcke,

    Vielen Dank dass Du die Lösung veröffentlich hast.

    1)    Jede Ausnahme in .NET Framework erbt von und erweitert die Exception-Klasse (die auch als generische Ausnahme bezeichnet ist).  Sie hat grundlegende Informationen über die Ausnahme (Nachricht, Stapelüberwachung, Quelle, etc.).

    2)    Um eine weitere spezifische Ausnahme zu bekommen, wie z. B. InvalidOperationException, die Klasse wird von Exception erben und zusätzliche Eigenschaften hinzufügen.

    3)    Der Try/Catch-Block kann beliebig viele Catch-Blöcke haben.

    4)    Die "beste Praxis" mit mehrere Catch-Blöcke ist mit einem spezifischeren Ausnahmetyp (wie InvalidOperationException) beginnen und dann mit Catch ex As Exception enden:

     

    Try

    Catch ex As InvalidOperationException

    Catch ex As TargetInvocationException

    Catch ex As Exception

    End Try

    Ausnahmebehandlung in VB.NET

    http://www.vbdotnetheaven.com/UploadFile/rajeshvs/dotnetException04162005022135AM/dotnetException.aspx

    Grüße,

    Robert

    Freitag, 23. Oktober 2009 16:00
    Moderator