Programm friert beim schließen RS232-Schnittstelle ein

  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von peterfido.

    Programm friert beim schließen RS232-Schnittstelle ein

    Hallo allerseits,

    schon lange war ich nicht mehr hier :D

    Ich habe ein Problem mit einer RS232 Schnittstelle. Ich lese Daten von einem µC. Dieser sendet die Daten ununterbrochen. Ich habe mir irgendwo aus dem Internet (vbArchiv oder wo auch immer) Code geholt, der auch prima "lesen kann".

    VB.NET-Quellcode

    1. Imports System.Text
    2. Public Class Form1
    3. #Region "Variablen und API's"
    4. ' Variable die das decodierte Byte aufnimmt
    5. Dim Programm As String
    6. 'Damit der eingehende Wert an die txtprogramm Textbox übergenben werden
    7. ' kann! Führt die Sub Wertübergabe aus!
    8. Private Delegate Sub DelegateSub()
    9. Private TextboxAktualisieren As New DelegateSub(AddressOf Wertübergabe)
    10. #End Region
    11. #Region "Form"
    12. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    13. closePort()
    14. End Sub
    15. Private Sub closePort()
    16. Try
    17. If SerialPort1.IsOpen Then
    18. SerialPort1.Close()
    19. End If
    20. Catch ex As Exception
    21. End Try
    22. End Sub
    23. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    24. Me.txtprogramm.Visible = False
    25. Me.cmd_portclose.Enabled = False
    26. Me.Text = "CAN-Gateway"
    27. Me.Top = Screen.PrimaryScreen.WorkingArea.Height / 2 - Me.Height / 2
    28. Me.Left = Screen.PrimaryScreen.WorkingArea.Width / 2 - Me.Width / 2
    29. ' Show all available COM ports.
    30. For Each sp As String In My.Computer.Ports.SerialPortNames
    31. ListBox1.Items.Add(sp)
    32. Next
    33. If Me.ListBox1.Items.Count > 0 Then
    34. Me.ListBox1.SelectedIndex = 0
    35. End If
    36. ' Serialport Daten (Für Feeler Fanuc Series 0-T: Baudrate 4800 ;
    37. ' StopBits One ; DataBits 7 ; Parity None ; Handshake None)
    38. 'SerialPort1.BaudRate = 115200
    39. 'SerialPort1.StopBits = IO.Ports.StopBits.One
    40. 'SerialPort1.DataBits = 8
    41. 'SerialPort1.Parity = IO.Ports.Parity.None
    42. 'SerialPort1.Handshake = IO.Ports.Handshake.None
    43. End Sub
    44. #End Region
    45. #Region "Datentransfer"
    46. Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As _
    47. System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    48. For i As Int32 = 0 To SerialPort1.BytesToRead ' Alle Bytes einzel
    49. ' lesen und anzeigen
    50. Try
    51. Dim buf As Byte() = {SerialPort1.BaseStream.ReadByte}
    52. Dim enc As New System.Text.ASCIIEncoding()
    53. Programm = enc.GetString(buf)
    54. Programm = Programm.Replace(Chr(13), Nothing)
    55. Me.Invoke(TextboxAktualisieren)
    56. Catch ex As Exception
    57. MessageBox.Show("Ein Übertragungsfehler ist aufgetreten.", _
    58. "Fehler", MessageBoxButtons.OK)
    59. End Try
    60. Next i
    61. End Sub
    62. Private Sub Wertübergabe()
    63. ' ## Daten in Textbox übertragen
    64. txtprogramm.AppendText(Programm)
    65. End Sub
    66. #End Region
    67. Private Sub cmd_end_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_end.Click
    68. closePort()
    69. End
    70. End Sub
    71. Private Sub cmd_portclose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_portclose.Click
    72. closePort()
    73. Me.txtprogramm.Visible = False
    74. Me.cmd_portclose.Enabled = False
    75. Me.ListBox1.Visible = True
    76. Me.cmd_portopen.Enabled = True
    77. End Sub
    78. Private Sub cmd_portopen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmd_portopen.Click
    79. With SerialPort1
    80. .BaudRate = 115200
    81. .Parity = IO.Ports.Parity.None
    82. .Handshake = IO.Ports.Handshake.None
    83. .DataBits = 8
    84. .StopBits = IO.Ports.StopBits.One
    85. .PortName = Me.ListBox1.SelectedItem
    86. End With
    87. If Not SerialPort1.IsOpen Then
    88. Try
    89. SerialPort1.Open()
    90. Me.cmd_portopen.Enabled = False
    91. Me.ListBox1.Visible = False
    92. Me.txtprogramm.Visible = True
    93. Me.Label1.Visible = False
    94. Me.cmd_portclose.Enabled = True
    95. Catch
    96. MsgBox("Fehler beim öffnen des Ports. Eventuell kein Gerät angeschlossen!")
    97. End Try
    98. Else
    99. MsgBox("Dieser Port wird bereits verwendet")
    100. End If
    101. End Sub
    102. End Class


    Mein Problem ist jetzt: Wenn ich versuche den Port zu schleißen, friert das ganze Programm ein.

    Ich weiß nicht genau woran es liegt aber ich denke dass es wegen den immer weiter kommenden Daten ist, die wiederum den Event DataReceived aufrufen und so den Prozess nicht gescheit sterben lassen. Ich habe es schon versucht in Threads aufzuteilen. Wenn ich dann den Thread geschlossen habe - fror das Programm wieder ein. Wenn ich den Thread ohne den Port zu schließen tötete - ging alles einwandfrei - ich konnte allerdings den Port nicht nocheinmal öffnen da er noch quasi geöffnet ist.

    Ich hoffe ihr könnt mich unterweisen was meinen Fehler angeht. Vielen Dank!
    Da bin ich ja froh, das VB2008 die selben Macken wie VB6 hat. Das liegt unter VB6 daran, dass die angekommenen Daten noch nicht verarbeitet worden sind. Als Lösungsansatz würde ich den Empfangsbuffer "runter drehen". Bei mir kommt dieses Verhalten hauptsächlich per virtuellem USB-Comport. Womöglich verbietet der Treiber des vCOM das schließen, während Daten noch unterwegs sind.
    Bei der physikalischen Schnittstelle habe ich diese "Probleme" nicht so beobachten können.
    Gruß
    Peterfido

    Keine Unterstützung per PN!