Einfaches Com-Programm hängt

  • VB.NET

Es gibt 34 Antworten in diesem Thema. Der letzte Beitrag () ist von M4st3rM.

    Hier ist mal mein kompletter Quelltext soweit.
    Das einzigste, was ich nun nicht verstanden habe ist
    Hinzukommt, dass du nun den ganzen Code im GUI-Thread ausführst.
    Rufe deine UpdatePortData direkt und ohne Invoke auf.




    Spoiler anzeigen

    Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Dim myPort As Array
    4. Dim Lokal_verbunden As Boolean
    5. Dim newString As String
    6. Dim Var_Licht_digital As Integer
    7. Dim Var_Licht_Analog As Single
    8. Dim Var_Poti1_digital As Integer
    9. Dim Var_poti1_analog As Single
    10. Dim Var_Poti2_digital As Integer
    11. Dim Var_poti2_analog As Single
    12. Dim Taster1 As Boolean
    13. Dim Taster2 As Boolean
    14. Dim Adresse As String
    15. Dim Wert As String
    16. Delegate Sub InvokeDelegate()
    17. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    18. SerialPort1.Close()
    19. End Sub
    20. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    21. SerialPort1.NewLine = Environment.NewLine
    22. SerialPort1.Encoding = System.Text.Encoding.UTF8
    23. myPort = IO.Ports.SerialPort.GetPortNames()
    24. ComboBox1.Items.AddRange(CType(myPort, Object()))
    25. ComboBox1.Text = "COM3"
    26. ComboBox2.Text = CStr(9600)
    27. Button1.Enabled = False
    28. Button2.Enabled = False
    29. Button3.Enabled = False
    30. Button5.Enabled = False
    31. Button8.Enabled = False
    32. End Sub
    33. Private Sub UpdatePortData(newString As String)
    34. Dim Splitted As String() = newString.Split(CChar("#"))
    35. Dim count As Integer
    36. count = Splitted.Length
    37. If count = 2 Then
    38. Adresse = Splitted(0)
    39. Wert = Splitted(1)
    40. If Adresse = "A001" Then
    41. Var_Licht_digital = CInt(Wert)
    42. If cockpit.Visible Then
    43. cockpit.Gasgriff_Tacho.BeginInvoke(New InvokeDelegate(AddressOf Gasgriff_Tacho_verändern))
    44. End If
    45. End If
    46. If Adresse = "A003" Then
    47. Var_Poti1_digital = CInt(Wert)
    48. If cockpit.Visible Then
    49. cockpit.IGBT_Tacho.BeginInvoke(New InvokeDelegate(AddressOf IGBT_Tacho_verändern))
    50. End If
    51. End If
    52. If Adresse = "A007" Then
    53. Taster1 = CBool(CInt(Wert))
    54. If cockpit.Visible Then
    55. cockpit.PictureBox5.BeginInvoke(New InvokeDelegate(AddressOf Bremse_Anzeige_verändern))
    56. End If
    57. End If
    58. End If
    59. End Sub
    60. Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    61. newString = SerialPort1.ReadLine.Trim
    62. Me.Invoke(Sub() UpdatePortData(newString))
    63. End Sub
    64. Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    65. SerialPort1.Write("SLED1:1" + vbCr)
    66. newString = ""
    67. End Sub
    68. Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
    69. SerialPort1.Write("SLED1:0" + vbCr)
    70. newString = ""
    71. End Sub
    72. Private Sub Button9_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button9.Click
    73. SerialPort1.Write("SLED2:0" + vbCr)
    74. newString = ""
    75. End Sub
    76. Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click
    77. SerialPort1.Write("SLED2:1" + vbCr)
    78. newString = ""
    79. End Sub
    80. Private Sub Button10_Click(sender As System.Object, e As System.EventArgs) Handles Button10.Click
    81. SerialPort1.PortName = ComboBox1.Text
    82. SerialPort1.BaudRate = CInt(ComboBox2.Text)
    83. SerialPort1.Open()
    84. End Sub
    85. Private Sub Button11_Click(sender As System.Object, e As System.EventArgs) Handles Button11.Click
    86. SerialPort1.Close()
    87. End Sub
    88. Public Sub Gasgriff_Tacho_verändern()
    89. cockpit.Gasgriff_Tacho.Value = Var_Poti1_digital
    90. End Sub
    91. Public Sub IGBT_Tacho_verändern()
    92. cockpit.IGBT_Tacho.Value = Var_Licht_digital
    93. End Sub
    94. Public Sub Bremse_Anzeige_verändern()
    95. If Taster1 = True Then
    96. cockpit.PictureBox5.Image = Kontrollprogrammv1.My.Resources.Resources.bremse_gelb
    97. ElseIf Taster1 = False Then
    98. cockpit.PictureBox5.Image = Kontrollprogrammv1.My.Resources.Resources.bremse_rot
    99. End If
    100. End Sub
    101. Private Sub Button12_Click(sender As System.Object, e As System.EventArgs) Handles Button12.Click
    102. cockpit.Show()
    103. End Sub
    104. Private Sub Button13_Click(sender As System.Object, e As System.EventArgs) Handles Button13.Click
    105. Notaus.Show()
    106. End Sub
    107. Private Sub Button14_Click(sender As System.Object, e As System.EventArgs) Handles Button14.Click
    108. Akkuüberwachung.Show()
    109. End Sub
    110. Private Sub Button15_Click(sender As System.Object, e As System.EventArgs) Handles Button15.Click
    111. Batterie12V.Show()
    112. End Sub
    113. Private Sub Button16_Click(sender As System.Object, e As System.EventArgs) Handles Button16.Click
    114. motorstatus.Show()
    115. End Sub
    116. Private Sub Button17_Click(sender As System.Object, e As System.EventArgs) Handles Button17.Click
    117. canmodulstatus.Show()
    118. End Sub
    119. Public Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    120. If SerialPort1.IsOpen = True Then
    121. Label6.Text = "Verbunden"
    122. Label6.ForeColor = Color.Green
    123. Lokal_verbunden = True
    124. Button4.Enabled = True
    125. Button7.Enabled = True
    126. Button6.Enabled = True
    127. Button9.Enabled = True
    128. Else
    129. Label6.Text = "Getrennt"
    130. Label6.ForeColor = Color.Red
    131. Lokal_verbunden = False
    132. Button4.Enabled = False
    133. Button7.Enabled = False
    134. Button6.Enabled = False
    135. Button9.Enabled = False
    136. End If
    137. End Sub
    138. End Class
    du kannst SerialPort.NewLine = vbCr machen und anschließend SerialPort.WriteLine verwenden.

    VB.NET-Quellcode

    1. ​If Taster1 = True Then

    das Überprüfen ob ein Boolescher Wert wahr ist, ist unnötig
    ->

    VB.NET-Quellcode

    1. If Taster1 Then

    das anschließende ElseIf ist bei booleschen Werten auch nicht nötig, wenn ein Wert nicht True ist, kann dieser nur noch False sein.
    -> Else verwenden
    Die newString Variable kannst du entfernen und nurnoch im DataReceived-Event deklarieren:

    VB.NET-Quellcode

    1. Dim newString As String = SerialPort1.ReadLine.Trim

    Aus den anderen Methoden kannst du die Zuweisung newString = "" komplett entfernen.

    anstelle von CInt würde ich Integer.Parse verwenden um Strings in Ints umzuwandeln.

    VB.NET-Quellcode

    1. Dim val As Integer = Integer.Parse(Wert)
    2. Dim bool As Boolean = val<>0 'CBool(val)

    VB.NET-Quellcode

    1. Lokal_verbunden = False
    2. Button4.Enabled = False
    3. Button7.Enabled = False
    4. Button6.Enabled = False
    5. Button9.Enabled = False

    Solche Zuweisungen kann man etwas zusammenfassen

    VB.NET-Quellcode

    1. Lokal_verbunden = Button4.Enabled = Button7.Enabled = .. = False

    Außerdem könntest du zusammengehörende Controls in ein Panel packen und entsprechend die Enabled-Eigenschaft des Panels setzen(wirkt sich auf alle Untercontrols aus)

    VB.NET-Quellcode

    1. cockpit.PictureBox5.BeginInvoke(New InvokeDelegate(AddressOf Bremse_Anzeige_verändern))

    Das könnte man theoretisch mit anonymen Methoden machen(so wie du den Aufruf von UpdatePortData machst)

    VB.NET-Quellcode

    1. cockpit.PictureBox5.BeginInvoke(Sub() If Taster1 Then
    2. cockpit.PictureBox5.Image = Kontrollprogrammv1.My.Resources.Resources.bremse_gelb
    3. Else
    4. cockpit.PictureBox5.Image = Kontrollprogrammv1.My.Resources.Resources.bremse_rot
    5. End If
    6. End Sub


    Was ich außerdem meinte war das hier:

    VB.NET-Quellcode

    1. Me.Invoke(Sub() UpdatePortData(newString))

    ->

    VB.NET-Quellcode

    1. UpdatePortData(newString)

    Denn die GUI Synchronization wird ja jetzt bereits mit BeginInvoke innerhalb der Methode gemacht.

    Allgemein solltest du jedoch deine Controls noch benennen, so kann man nicht erkennen, wofür welche Controls zuständig sind.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Okay, super, Danke für die vielen Hinweise ;)
    Habe soweit alles umgesetzt, außer das letzte.
    Wenn ich ein Label erstelle um den Empfangstext anzuzeigen gibt es

    Quellcode

    1. {"Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement Label1 erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde."}
    aus.

    Bezügl. der Empfangsgeschwindigkeit ändert sich aber nichts.
    Hast du da zufällig noch ne Idee?
    Genau das habe ich bereits erklärt, dafür ist das Invoke da um Threads mit dem GUI-Thread zu synchronisieren, du kannst nicht auf die GUI aus einem anderem Thread als dem GUI Thread zugreifen.

    Mir ist noch was anderes böses aufgefallen, dein Timer, ich erklärs mal an einem Beispiel, dass jemand aus dem Forum(ich glaube es war picoflop) gerne gebracht hat.
    Wenn du eine Pizza bestellst, gehst du nicht jede Sekunde an die Tür um zu gucken ob die Pizza schon da ist, sondern wartest bis der Lieferant an der Tür klingelt.
    Der SerialPort wird nur geschlossen, wenn du dies explizit tust, also ändere deine GUI an den stellen, an denen du den Port schließt und guck nicht alle paar ms(s) ob er bereits geschlossen wurde.

    Das letzte was mir dazu vlt. noch einfällt wäre jetzt das Lesen tatsächlich selbst und gepuffert zu machen...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Ja der Timer macht so natürlich keinen Sinn, Danke ;)
    Habe mir nun verschiedene Funktionen mit ReadByte und Readchar geschrieben, allerdings sind diese noch langsamer als ReadLine.

    Nun habe ich allerdings eine Lösung gefunden: Der Timer steht auf 100ms und löscht dann den Eingangsbuffer.
    Dadurch konnte ich die Zeit zwischen den Übertragungen auf 1ms Reduzieren. Evtl. reicht das für meinen Fall schon aus.
    Was, welcher Timer löscht den Eingangsbufer?

    Gepuffertes lesen ist btw. ziemlich genau das gegenteil von einzelnen Zeichen lesen.
    msdn.microsoft.com/de-de/library/ms143549(v=vs.110).aspx
    das speicherst dir zwischen während dessen du parallel die Daten auswertest, sozusagen einen Ringbuffer.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Der Timer der zuvor geprüft hat, ob der Com-Port offen ist.

    Quellcode

    1. Public Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    2. If SerialPort1.IsOpen Then
    3. SerialPort1.DiscardInBuffer()
    4. End If
    5. End Sub

    jvbsl schrieb:

    Der SerialPort wird nur geschlossen, wenn du dies explizit tust, also ändere deine GUI an den stellen, an denen du den Port schließt und guck nicht alle paar ms(s) ob er bereits geschlossen wurde.

    M4st3rM schrieb:

    ob der Com-Port offen ist.
    What :?:
    Das Port bleibt offen, solange eine Kommunikation erforderlich ist oder solange das Programm läuft.
    Wenn Du den Eingabepuffer permanent löschst, löschst Du ggf. Informationen, die Du empfangen willst.

    M4st3rM schrieb:

    VB.NET-Quellcode

    1. SerialPort1.Write("SLED1:1" + vbCr)
    machst Du

    VB.NET-Quellcode

    1. SerialPort1.WriteLine("SLED1:1")
    ---------------------------------------

    jvbsl schrieb:

    Solche Zuweisungen kann man etwas zusammenfassen

    VB.NET-Quellcode

    1. Lokal_verbunden = Button4.Enabled = Button7.Enabled = .. = False
    What :?:
    Hast Du das probiert? Ich schon. :S



    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „RodFromGermany“ ()

    RodFromGermany schrieb:

    machst Du[...]

    hab ich bereits geschrieben.

    RodFromGermany schrieb:

    What
    Hast Du das probiert? Ich schon.

    heißt das etwa es funktioniert nicht? Ist gut möglich, dann wird das wohl in allen Sprachen außer VB .Net funktionieren :D
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    jvbsl schrieb:

    es funktioniert nicht?
    Jou.

    C-Quellcode

    1. a = b = c = false;

    Das ist ein C-, C++-, C#-Ranz.
    VB macht da eine komplexe logische Vergleichsoperation draus.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Das ist ein C-, C++-, C#-Ranz.

    Da darf ich wiedersprechen und sagen, dass es eher umgekehrt ist(angefangen damit, dass Zuweisungsoperator und Vergleichsoperator nicht unterscheidbar sind). Solch ein Ausdruck ergibt komplett Sinn, auch mathematisch. Außerdem kann man damit wahnsinnig schöne Konstrukte machen.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    jvbsl schrieb:

    wahnsinnig schöne Konstrukte
    Weiß ich, aber ich vermeide so was. :/
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Okay Leute ;)
    Vielen Dank. Nun habe ich noch weiter gelesen und versucht eine Lösung zu finden, mit der auch einmalige Ereignisse nicht verloren gehen. Vieleicht mag jemand da nochmal raufgucke und schauen, ob da noch Murks drinn ist? Funktionieren tut es zumindest.
    Ich habe allerdings das Datenformat ändern müssen.
    Die Datenpakete sehen nun so aus:
    D#A001#1023#E#;
    D = Anfang des Satzes
    A001 = Hier die Adresse
    1023 = Datenwert
    E = Ende des Satzes. Nötig war dies, um zu erkennen, ob der Datensatz vollständig ist. Wenn der Timer gerade in der Übertragung ausgerufen wird könnte sonst D#A001#10 empfangen werden.
    So habe ich allerdings noch das Problem, das zwei Datensätze in 100ms verloren gehen könnte.
    (Erster und letzter Datensatz). Evtl. sende ich alle einmaligen Meldungen zweimal oder lasse es so.

    Geschwindigkeit ist aufjedenfall unter 1ms, aber Die GUI "verpasst" trotzdem einige Werte.



    VB.NET-Quellcode

    1. Public Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    2. If SerialPort1.IsOpen Then
    3. 'Wird alle 100ms ausgeführt
    4. Me.Invoke(Sub() Test())
    5. End If
    6. End Sub


    VB.NET-Quellcode

    1. Private Sub Test()
    2. Dim ToRead As Integer = SerialPort1.BytesToRead
    3. Dim länge As Integer
    4. Dim cnt As Integer
    5. Dim Meintext As String
    6. Meintext = ""
    7. cnt = 0
    8. If ToRead > 0 Then
    9. Dim Buffer(ToRead - 1) As Char
    10. 'Kompletten Speicher lesen (Zeichenweise)
    11. SerialPort1.Read(Buffer, 0, ToRead)
    12. länge = Buffer.Length
    13. 'Zeichen zum String "Meintext" zufügen, bis alle Zeichen angefügt sind
    14. For index As Integer = 0 To länge - 1
    15. Meintext = Meintext + Buffer(index)
    16. Next
    17. 'Den String bei allen #-Zeichen splitten
    18. Dim Splitted As String() = Meintext.Split(CChar("#"))
    19. Dim count As Integer
    20. count = Splitted.Length
    21. For Index2 As Integer = 0 To count - 1
    22. If Index2 < (count - 4) Then
    23. 'Wenn im ersten (aufgerufenen) Array ein D und im 3 danach ein E folgt,
    24. 'ist der Datensatz vollständig
    25. If Splitted(Index2) = "D" And Splitted(Index2 + 3) = "E" Then
    26. Adresse = Splitted(Index2 + 1)
    27. Wert = Splitted(Index2 + 2)
    28. 'Auswerten der Daten
    29. If Adresse = "A001" Then
    30. Var_Licht_digital = Integer.Parse(Wert)
    31. If cockpit.Visible Then
    32. cockpit.Gasgriff_Tacho.BeginInvoke(New InvokeDelegate(AddressOf Gasgriff_Tacho_verändern))
    33. End If
    34. End If
    35. If Adresse = "A003" Then
    36. Var_Poti1_digital = Integer.Parse(Wert)
    37. If cockpit.Visible Then
    38. cockpit.IGBT_Tacho.BeginInvoke(New InvokeDelegate(AddressOf IGBT_Tacho_verändern))
    39. End If
    40. End If
    41. If Adresse = "A007" Then
    42. Taster1 = Integer.Parse(Wert) <> 0
    43. If cockpit.Visible Then
    44. cockpit.PictureBox5.BeginInvoke(New InvokeDelegate(AddressOf Bremse_Anzeige_verändern))
    45. End If
    46. End If
    47. If Adresse = "A0010" Then
    48. Meldung = Wert
    49. ListBox1.BeginInvoke(New InvokeDelegate(AddressOf Meldung_Ausgeben))
    50. End If
    51. Index2 = Index2 + 3
    52. End If
    53. End If
    54. Next
    55. Meintext = ""
    56. End If
    57. End Sub

    M4st3rM schrieb:

    Die Datenpakete sehen nun so aus:
    D#A001#1023#E#;
    Wenn das Semikolon das Ende einer Zeile darstellt, gib dem Port dies:

    VB.NET-Quellcode

    1. Me.SerialPort1.NewLine = ";"
    und ruf dann die Werte mit

    VB.NET-Quellcode

    1. Dim txt = Me.SerialPort1.ReadLine
    ab.
    Wozu rufst Du das InvokeDelegate auf? Die Prozedur Test() läuft bereits im Main-Thread.
    Vielleicht solltest Du die Daten auslesen und im Serial-Thread bereitstellen und dann ein GUI-Update-Invoke aufrufen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Habe das Programm nun fast komplett fertig.
    Allerdings erhalte ich noch zwischendurch manchmal eine Fehlermeldung (unregelmäßig, zwischen 10 und 300 Sekunden dazwischen), und zwar:

    Brainfuck-Quellcode

    1. Informationen über das Aufrufen von JIT-Debuggen
    2. anstelle dieses
    3. Dialogfelds finden Sie am Ende dieser Meldung.
    4. ************** Ausnahmetext **************
    5. System.FormatException: Die
    6. Eingabezeichenfolge hat das falsche Format.
    7. bei
    8. System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method,
    9. Object[] args, Boolean synchronous)
    10. bei
    11. System.Windows.Forms.Control.Invoke(Delegate method, Object[] args)
    12. bei
    13. Kontrollprogrammv1.Form1.Timer1_Tick(Object sender, EventArgs e)
    14. bei
    15. System.Windows.Forms.Timer.OnTick(EventArgs e)
    16. bei
    17. System.Windows.Forms.Timer.TimerNativeWindow.WndProc(Message& m)
    18. bei
    19. System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr
    20. wparam, IntPtr lparam)
    21. ************** Geladene Assemblys **************
    22. mscorlib
    23. Assembly-Version: 4.0.0.0.
    24. Win32-Version: 4.0.30319.34209 built by:
    25. FX452RTMGDR.
    26. CodeBase: file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll.
    27. ----------------------------------------
    28. ELMO
    29. 1.0 BETA
    30. Assembly-Version: 1.0.0.0.
    31. Win32-Version: 1.0.0.0.
    32. CodeBase: file:///C:/Users/I-User/AppData/Local/Apps/2.0/2KHEPNQB.BDZ/5GYJ7RE3.TR0/elmo..tion_a2bfb8c1eb1f1fbc_0001.0000_c41869981753519e/ELMO 1.0 BETA.exe.
    33. ----------------------------------------
    34. Microsoft.VisualBasic
    35. Assembly-Version: 10.0.0.0.
    36. Win32-Version: 12.0.51209.34209 built by:
    37. FX452RTMGDR.
    38. CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/Microsoft.VisualBasic/v4.0_10.0.0.0__b03f5f7f11d50a3a/Microsoft.VisualBasic.dll.
    39. ----------------------------------------
    40. System.Windows.Forms
    41. Assembly-Version: 4.0.0.0.
    42. Win32-Version: 4.0.30319.34209 built by:
    43. FX452RTMGDR.
    44. CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll.
    45. ----------------------------------------
    46. System.Drawing
    47. Assembly-Version: 4.0.0.0.
    48. Win32-Version: 4.0.30319.34209 built by:
    49. FX452RTMGDR.
    50. CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll.
    51. ----------------------------------------
    52. System
    53. Assembly-Version: 4.0.0.0.
    54. Win32-Version: 4.0.30319.34238 built by:
    55. FX452RTMGDR.
    56. CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll.
    57. ----------------------------------------
    58. System.Runtime.Remoting
    59. Assembly-Version: 4.0.0.0.
    60. Win32-Version: 4.0.30319.34245 built by:
    61. FX452RTMGDR.
    62. CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Runtime.Remoting/v4.0_4.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll.
    63. ----------------------------------------
    64. mscorlib.resources
    65. Assembly-Version: 4.0.0.0.
    66. Win32-Version: 4.0.30319.18408 built by:
    67. FX451RTMGREL.
    68. CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/mscorlib.resources/v4.0_4.0.0.0_de_b77a5c561934e089/mscorlib.resources.dll.
    69. ----------------------------------------
    70. Microsoft.VisualBasic.resources
    71. Assembly-Version: 10.0.0.0.
    72. Win32-Version: 11.0.50938.18408 built by:
    73. FX451RTMGREL.
    74. CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/Microsoft.VisualBasic.resources/v4.0_10.0.0.0_de_b03f5f7f11d50a3a/Microsoft.VisualBasic.resources.dll.
    75. ----------------------------------------
    76. System.Windows.Forms.resources
    77. Assembly-Version: 4.0.0.0.
    78. Win32-Version: 4.0.30319.18408 built by:
    79. FX451RTMGREL.
    80. CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms.resources/v4.0_4.0.0.0_de_b77a5c561934e089/System.Windows.Forms.resources.dll.
    81. ----------------------------------------
    82. System.Xml
    83. Assembly-Version: 4.0.0.0.
    84. Win32-Version: 4.0.30319.34234 built by:
    85. FX452RTMGDR.
    86. CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll.
    87. ----------------------------------------
    88. ************** JIT-Debuggen **************
    89. Um das JIT-Debuggen
    90. (Just-In-Time) zu aktivieren, muss in der
    91. Konfigurationsdatei der Anwendung
    92. oder des Computers
    93. (machine.config) der jitDebugging-Wert im Abschnitt
    94. system.windows.forms festgelegt werden.
    95. Die Anwendung muss mit aktiviertem
    96. Debuggen kompiliert werden.
    97. Zum Beispiel:
    98. <configuration>
    99. <system.windows.forms jitDebugging="true"
    100. />
    101. </configuration>
    102. Wenn das JIT-Debuggen aktiviert ist, werden alle Ausnahmefehler an den
    103. JIT-Debugger gesendet, der auf dem
    104. Computer registriert ist, und nicht in
    105. diesem Dialogfeld behandelt.



    Kann man da irgendwo rauslesen, wo der Fehler auftritt? Ich vermute mal das es zwischendurch mal zu Datenfehlern kommt, was irgendwie zu einemF ehler führt.
    Kann ich diese irgendwie abfangen bzw. die Meldung unterdrücken?

    Edit:
    Habe noch eine Frage:
    Ich habe eine ListBox, in der Meldungen ausgegeben werden.
    Bei einer höheren Baut-Rate werden allerdings einträge in der Listbox doppelt hinzugefügt.
    An was kann dies liegen?

    If Adresse = "A072" Then
    Meldung = Wert
    If cockpit.Visible Then
    cockpit.Meldungen.BeginInvoke(New InvokeDelegate(AddressOf Update_Meldungen))
    End If
    End If


    Public Sub Update_Meldungen()
    cockpit.Meldungen.Items.Add(Meldung)
    cockpit.Meldungen.TopIndex = cockpit.Meldungen.Items.Count - 1
    End Sub

    Gruß
    Dirk

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „M4st3rM“ ()