Einfaches Com-Programm hängt

  • VB.NET

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

    Einfaches Com-Programm hängt

    Hallo,
    für ein größeres Projekt möchte ich gerne eine Steuersoftware schreiben.
    Ich habe bisher etwas Erfahrung in PHP und Bascom, bin aber noch Anfänger.
    Ich benötige ein Programm, welches über die Serielle Schnittstelle mit Platinen kommuniziert, Zustände Ausgibt und ändern kann.
    Nach diversen Beispielen im Internet habe ich nun auch ein Programm geschrieben, welches ganz minimal diese Aufgabe erfüllen soll.
    Das Senden zu den Platinen klappt bisher immer gut, Probleme habe ich beim Empfangen der Nachrichten gehabt (bzw. immer noch).

    Also hier ist mal das Programm:




    Spoiler anzeigen

    Quellcode

    1. Public Class Form1
    2. Dim a$, f$, count
    3. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    4. SerialPort2.Close()
    5. End Sub
    6. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    7. SerialPort2.Open()
    8. End Sub
    9. Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    10. SerialPort2.Write("SLED1:1" + vbCr)
    11. End Sub
    12. Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
    13. SerialPort2.Write("SLED1:0" + vbCr)
    14. End Sub
    15. Private Sub Button9_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button9.Click
    16. SerialPort2.Write("SLED2:1" + vbCr)
    17. End Sub
    18. Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click
    19. SerialPort2.Write("SLED2:0" + vbCr)
    20. End Sub
    21. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    22. Dim xvar As String
    23. xvar = SerialPort2.ReadLine
    24. Dim newString As String = xvar.Replace(vbCr, "").Replace(vbLf, "")
    25. Label2.Text = newString
    26. If newString = "Taster1:0" Then
    27. Button1.BackColor = Color.Red
    28. End If
    29. If newString = "Taster1:1" Then
    30. Button1.BackColor = Color.Green
    31. End If
    32. If newString = "Taster2:0" Then
    33. Button2.BackColor = Color.Red
    34. End If
    35. If newString = "Taster2:1" Then
    36. Button2.BackColor = Color.Green
    37. End If
    38. If newString = "Taster3:0" Then
    39. Button3.BackColor = Color.Red
    40. End If
    41. If newString = "Taster3:1" Then
    42. Button3.BackColor = Color.Green
    43. End If
    44. If newString = "LED1:1" Then
    45. Button5.BackColor = Color.Green
    46. End If
    47. If newString = "LED1:0" Then
    48. Button5.BackColor = Color.Red
    49. End If
    50. If newString = "LED2:1" Then
    51. Button8.BackColor = Color.Green
    52. End If
    53. If newString = "LED2:0" Then
    54. Button8.BackColor = Color.Red
    55. End If
    56. End Sub
    57. End Class


    Im Prinzip macht es erstmal ganz einfach mit fest eingestellten Werten eine Com-Verbindung.
    Von der Platine werden Taster zustände übertragen und über farbliche Buttons dargestellt.
    LEDs lassen sich über Buttons ein und Ausschalten, der Zustand dieser wird auch von der Platine übertragen und dargestellt.

    Das Problem ist nun, das dieses Programm sehr "hakend" funktioniert. Der Empfang von dem Platinen klappt (wenn auch nur langsam), allerdings scheint sich das Programm irgendwie aufzuhängen. Die LEDs lassen sich nur schalten, wenn gerade Daten von den Platinen kommen bzw. auch das Programm lässt sich auf dem Desktop nicht verschieben.
    Es liegt vermutlich an dem zum Datenempfang benutzen Timer (Dieser Code-Teil stammt aus dem Internet als Beispiel). Ohne das Unterprogramm zum Datenempfang funktioniert das Senden einwandfrei.

    Nun meine Frage, kann mir jemand helfen, das Unterprogramm zum Empfang zu ändern?
    Auf dem Prozessor läuft es ja so ab, das sobald ein Zeichen im Buffer liegt dieses zu einem String addiert wird und sobald das Zeichen ein CR ist dieser String ausgewertet wird.
    So würde ich das in VB am liebsten ja auch machen, habe aber oft gelesen dass dies schlecht ist.

    Danke & viele Grüße
    Dirk
    Dateien
    • Com-Test.Designer.vb

      (9,22 kB, 126 mal heruntergeladen, zuletzt: )
    • Com-Test.vb

      (2,45 kB, 109 mal heruntergeladen, zuletzt: )
    Willkommen im Forum. :thumbup:

    M4st3rM schrieb:

    das Unterprogramm zum Empfang zu ändern?
    Ohne die richtige Gegenstelle ist das wie Stochern im Nebel.
    Zunächst mal: Was ganz genau empfängt und sendet die Gegenstelle?
    Byte oder Char, und wenn Char, in welcher "Sprache" => Encoding, ZeilenEnde-Zeichen?
    Wenn Dies geklärt und implementiert ist, sollte Dein Programm laufen.
    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!
    Generell ist das beliebig, in meinem Testprogramm sendet die Platine
    Beispiel (Code aus dem Prozessor):
    LED1:1 /n /r 'LED 1 ist an
    LED1:0 /n /r 'LED 1 ist aus
    Taster1:1 /n /r 'Taster 1 ist betätigt
    Taster1:0 /n /r 'Taster 1 ist nicht betätigt

    Generell soll das aber egal sein, da ich im weiteren Programm eine String-Auswertung schreiben möchte.
    Ich Sende und Empfange also immer Strings mit undefinierter Länge, welche aber durch ein CR und LF angeschlossen werden, alternativ kann ich natürlich weitere Steuerzeichen einfügen.
    Empfangen tut sie Befehle in der Form

    Beispiel (Code aus VB)
    "SLED2:1" + vbCr 'LED 2 einschalten
    "SLED2:0" + vbCr 'LED 2 ausschalten

    Wie oben beschrieben, schreibt der Prozessor die Chars zu einem String zusammen und wertet diesen beim Empfang eines CR (vbCr) aus.

    M4st3rM schrieb:

    Generell soll das aber egal sein
    Dir vielleicht, Deiner Hardware nicht.
    In .NET sind Strings IMMER UnicodeStrings, was insbesondere bedeutet, dass ein Char 2 Byte lang ist.
    Mit dem geeigneten Encoding kannst Du dem SerialPort jedoch sagen, dass es nur 1 Byte pro Char senden soll.
    Wenn Du eine Pizza bestellst, läufst Du nicht alle 2 Minuten zur Tür und siehst nach, ob der Bote vor der Tür steht, sondern Du wartest, bis er klingelt.
    Also probier mal dies:
    Com-Test.vb

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    3. SerialPort2.Close()
    4. End Sub
    5. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    6. SerialPort2.NewLine = Environment.NewLine
    7. SerialPort2.Encoding = System.Text.Encoding.UTF8
    8. SerialPort2.Open()
    9. End Sub
    10. Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    11. SerialPort2.WriteLine("SLED1:1")
    12. End Sub
    13. Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
    14. SerialPort2.WriteLine("SLED1:0")
    15. End Sub
    16. Private Sub Button9_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button9.Click
    17. SerialPort2.WriteLine("SLED2:1")
    18. End Sub
    19. Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click
    20. SerialPort2.WriteLine("SLED2:0")
    21. End Sub
    22. Private Sub UpdatePortData(newString As String)
    23. Label2.Text = newString
    24. If newString = "Taster1:0" Then
    25. Button1.BackColor = Color.Red
    26. ElseIf newString = "Taster1:1" Then
    27. Button1.BackColor = Color.Green
    28. ElseIf newString = "Taster2:0" Then
    29. Button2.BackColor = Color.Red
    30. ElseIf newString = "Taster2:1" Then
    31. Button2.BackColor = Color.Green
    32. ElseIf newString = "Taster3:0" Then
    33. Button3.BackColor = Color.Red
    34. ElseIf newString = "Taster3:1" Then
    35. Button3.BackColor = Color.Green
    36. ElseIf newString = "LED1:1" Then
    37. Button5.BackColor = Color.Green
    38. ElseIf newString = "LED1:0" Then
    39. Button5.BackColor = Color.Red
    40. ElseIf newString = "LED2:1" Then
    41. Button8.BackColor = Color.Green
    42. ElseIf newString = "LED2:0" Then
    43. Button8.BackColor = Color.Red
    44. End If
    45. End Sub
    46. Private Sub SerialPort2_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort2.DataReceived
    47. Dim newString As String = SerialPort2.ReadLine.Trim
    48. Me.Invoke(Sub() UpdatePortData(newString))
    49. End Sub
    50. End Class

    Com-Test.vb

    VB.NET-Quellcode

    1. <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
    2. Partial Class Form1
    3. Inherits System.Windows.Forms.Form
    4. 'Das Formular überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen.
    5. <System.Diagnostics.DebuggerNonUserCode()> _
    6. Protected Overrides Sub Dispose(ByVal disposing As Boolean)
    7. Try
    8. If disposing AndAlso components IsNot Nothing Then
    9. components.Dispose()
    10. End If
    11. Finally
    12. MyBase.Dispose(disposing)
    13. End Try
    14. End Sub
    15. 'Wird vom Windows Form-Designer benötigt.
    16. Private components As System.ComponentModel.IContainer
    17. 'Hinweis: Die folgende Prozedur ist für den Windows Form-Designer erforderlich.
    18. 'Das Bearbeiten ist mit dem Windows Form-Designer möglich.
    19. 'Das Bearbeiten mit dem Code-Editor ist nicht möglich.
    20. <System.Diagnostics.DebuggerStepThrough()> _
    21. Private Sub InitializeComponent()
    22. Me.components = New System.ComponentModel.Container()
    23. Me.Label1 = New System.Windows.Forms.Label()
    24. Me.Label2 = New System.Windows.Forms.Label()
    25. Me.SerialPort2 = New System.IO.Ports.SerialPort(Me.components)
    26. Me.Button1 = New System.Windows.Forms.Button()
    27. Me.Button2 = New System.Windows.Forms.Button()
    28. Me.Button3 = New System.Windows.Forms.Button()
    29. Me.Button4 = New System.Windows.Forms.Button()
    30. Me.Button5 = New System.Windows.Forms.Button()
    31. Me.Button6 = New System.Windows.Forms.Button()
    32. Me.Button7 = New System.Windows.Forms.Button()
    33. Me.Button8 = New System.Windows.Forms.Button()
    34. Me.Button9 = New System.Windows.Forms.Button()
    35. Me.Label3 = New System.Windows.Forms.Label()
    36. Me.Label4 = New System.Windows.Forms.Label()
    37. Me.SuspendLayout()
    38. '
    39. 'Label1
    40. '
    41. Me.Label1.FlatStyle = System.Windows.Forms.FlatStyle.System
    42. Me.Label1.Location = New System.Drawing.Point(12, 18)
    43. Me.Label1.Name = "Label1"
    44. Me.Label1.Size = New System.Drawing.Size(90, 18)
    45. Me.Label1.TabIndex = 2
    46. Me.Label1.Text = "Empfangener Text"
    47. Me.Label1.TextAlign = System.Drawing.ContentAlignment.TopRight
    48. '
    49. 'Label2
    50. '
    51. Me.Label2.FlatStyle = System.Windows.Forms.FlatStyle.System
    52. Me.Label2.Font = New System.Drawing.Font("Tahoma", 18.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
    53. Me.Label2.ImageAlign = System.Drawing.ContentAlignment.TopRight
    54. Me.Label2.Location = New System.Drawing.Point(10, 36)
    55. Me.Label2.Name = "Label2"
    56. Me.Label2.Size = New System.Drawing.Size(148, 29)
    57. Me.Label2.TabIndex = 3
    58. Me.Label2.Text = "Empty"
    59. Me.Label2.TextAlign = System.Drawing.ContentAlignment.TopRight
    60. '
    61. 'SerialPort2
    62. '
    63. Me.SerialPort2.Handshake = System.IO.Ports.Handshake.XOnXOff
    64. Me.SerialPort2.PortName = "COM2"
    65. Me.SerialPort2.ReadBufferSize = 1024
    66. Me.SerialPort2.RtsEnable = True
    67. '
    68. 'Button1
    69. '
    70. Me.Button1.BackColor = System.Drawing.SystemColors.ControlDarkDark
    71. Me.Button1.Location = New System.Drawing.Point(12, 82)
    72. Me.Button1.Name = "Button1"
    73. Me.Button1.Size = New System.Drawing.Size(75, 23)
    74. Me.Button1.TabIndex = 21
    75. Me.Button1.Text = "Taster 1"
    76. Me.Button1.UseVisualStyleBackColor = False
    77. '
    78. 'Button2
    79. '
    80. Me.Button2.BackColor = System.Drawing.SystemColors.ControlDarkDark
    81. Me.Button2.Location = New System.Drawing.Point(12, 111)
    82. Me.Button2.Name = "Button2"
    83. Me.Button2.Size = New System.Drawing.Size(75, 23)
    84. Me.Button2.TabIndex = 23
    85. Me.Button2.Text = "Taster 2"
    86. Me.Button2.UseVisualStyleBackColor = False
    87. '
    88. 'Button3
    89. '
    90. Me.Button3.BackColor = System.Drawing.SystemColors.ControlDarkDark
    91. Me.Button3.Location = New System.Drawing.Point(12, 140)
    92. Me.Button3.Name = "Button3"
    93. Me.Button3.Size = New System.Drawing.Size(75, 23)
    94. Me.Button3.TabIndex = 24
    95. Me.Button3.Text = "Taster 3"
    96. Me.Button3.UseVisualStyleBackColor = False
    97. '
    98. 'Button4
    99. '
    100. Me.Button4.BackColor = System.Drawing.SystemColors.ControlDarkDark
    101. Me.Button4.Location = New System.Drawing.Point(11, 210)
    102. Me.Button4.Name = "Button4"
    103. Me.Button4.Size = New System.Drawing.Size(41, 23)
    104. Me.Button4.TabIndex = 25
    105. Me.Button4.Text = "EIN"
    106. Me.Button4.UseVisualStyleBackColor = False
    107. '
    108. 'Button5
    109. '
    110. Me.Button5.BackColor = System.Drawing.SystemColors.ControlDarkDark
    111. Me.Button5.Location = New System.Drawing.Point(61, 210)
    112. Me.Button5.Name = "Button5"
    113. Me.Button5.Size = New System.Drawing.Size(41, 23)
    114. Me.Button5.TabIndex = 26
    115. Me.Button5.UseVisualStyleBackColor = False
    116. '
    117. 'Button6
    118. '
    119. Me.Button6.BackColor = System.Drawing.SystemColors.ControlDarkDark
    120. Me.Button6.Location = New System.Drawing.Point(117, 210)
    121. Me.Button6.Name = "Button6"
    122. Me.Button6.Size = New System.Drawing.Size(41, 23)
    123. Me.Button6.TabIndex = 27
    124. Me.Button6.Text = "AUS"
    125. Me.Button6.UseVisualStyleBackColor = False
    126. '
    127. 'Button7
    128. '
    129. Me.Button7.BackColor = System.Drawing.SystemColors.ControlDarkDark
    130. Me.Button7.Location = New System.Drawing.Point(117, 239)
    131. Me.Button7.Name = "Button7"
    132. Me.Button7.Size = New System.Drawing.Size(41, 23)
    133. Me.Button7.TabIndex = 30
    134. Me.Button7.Text = "AUS"
    135. Me.Button7.UseVisualStyleBackColor = False
    136. '
    137. 'Button8
    138. '
    139. Me.Button8.BackColor = System.Drawing.SystemColors.ControlDarkDark
    140. Me.Button8.Location = New System.Drawing.Point(61, 239)
    141. Me.Button8.Name = "Button8"
    142. Me.Button8.Size = New System.Drawing.Size(41, 23)
    143. Me.Button8.TabIndex = 29
    144. Me.Button8.UseVisualStyleBackColor = False
    145. '
    146. 'Button9
    147. '
    148. Me.Button9.BackColor = System.Drawing.SystemColors.ControlDarkDark
    149. Me.Button9.Location = New System.Drawing.Point(12, 239)
    150. Me.Button9.Name = "Button9"
    151. Me.Button9.Size = New System.Drawing.Size(41, 23)
    152. Me.Button9.TabIndex = 28
    153. Me.Button9.Text = "EIN"
    154. Me.Button9.UseVisualStyleBackColor = False
    155. '
    156. 'Label3
    157. '
    158. Me.Label3.AutoSize = True
    159. Me.Label3.Location = New System.Drawing.Point(9, 65)
    160. Me.Label3.Name = "Label3"
    161. Me.Label3.Size = New System.Drawing.Size(79, 13)
    162. Me.Label3.TabIndex = 31
    163. Me.Label3.Text = "Taster-Zustand"
    164. '
    165. 'Label4
    166. '
    167. Me.Label4.AutoSize = True
    168. Me.Label4.Location = New System.Drawing.Point(8, 183)
    169. Me.Label4.Name = "Label4"
    170. Me.Label4.Size = New System.Drawing.Size(75, 13)
    171. Me.Label4.TabIndex = 32
    172. Me.Label4.Text = "LED's Steuern"
    173. '
    174. 'Form1
    175. '
    176. Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
    177. Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
    178. Me.ClientSize = New System.Drawing.Size(179, 284)
    179. Me.Controls.Add(Me.Label4)
    180. Me.Controls.Add(Me.Label3)
    181. Me.Controls.Add(Me.Button7)
    182. Me.Controls.Add(Me.Button8)
    183. Me.Controls.Add(Me.Button9)
    184. Me.Controls.Add(Me.Button6)
    185. Me.Controls.Add(Me.Button5)
    186. Me.Controls.Add(Me.Button4)
    187. Me.Controls.Add(Me.Button3)
    188. Me.Controls.Add(Me.Button2)
    189. Me.Controls.Add(Me.Button1)
    190. Me.Controls.Add(Me.Label2)
    191. Me.Controls.Add(Me.Label1)
    192. Me.Name = "Form1"
    193. Me.Text = "Form1"
    194. Me.ResumeLayout(False)
    195. Me.PerformLayout()
    196. End Sub
    197. Friend WithEvents Label1 As System.Windows.Forms.Label
    198. Friend WithEvents Label2 As System.Windows.Forms.Label
    199. Friend WithEvents SerialPort2 As System.IO.Ports.SerialPort
    200. Friend WithEvents Button1 As System.Windows.Forms.Button
    201. Friend WithEvents Button2 As System.Windows.Forms.Button
    202. Friend WithEvents Button3 As System.Windows.Forms.Button
    203. Friend WithEvents Button4 As System.Windows.Forms.Button
    204. Friend WithEvents Button5 As System.Windows.Forms.Button
    205. Friend WithEvents Button6 As System.Windows.Forms.Button
    206. Friend WithEvents Button7 As System.Windows.Forms.Button
    207. Friend WithEvents Button8 As System.Windows.Forms.Button
    208. Friend WithEvents Button9 As System.Windows.Forms.Button
    209. Friend WithEvents Label3 As System.Windows.Forms.Label
    210. Friend WithEvents Label4 As System.Windows.Forms.Label
    211. End Class
    Und:
    Irgendwo musst u die BackColor der Buttons wieder zurücksetzen. ;)
    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!
    Entschuldige bitte die so späte Antwort, hab leider ein wichtiges Kabel von meinem Programmiergerät vergessen :cursing: und bin erst heute dazu gekommen, das Programm "richtig" zu testen:
    Funktioniert super ;)
    Nur SerialPort1.WriteLine geht nicht, wenn ich nur Write nehmen läuft alles.

    Vielen Dank ;)
    Nun habe ich leider doch noch ein Problem. In meinem "kleinen" Testaufbau mit den 3 Tastern und den beiden LEDs läuft das alles ganz gut.
    Nun habe ich allerdings auch ein paar Analogwerte erfasst.
    Die Schnittstelle arbeitet mit 19200 Baud (später sollen 57600 Baud genutzt werden) und die Daten werden mit maximaler Geschwindigkeit übertragen. Dabei funktioniert das ganze nun nicht mehr. die Daten werden zwar Empfangen, aber es dauert endlos lange bis sie verarbeitet werden.
    Ich habe nun gelesen, das dies an der verwendeten Funktion serialPort1.ReadLine() liegt.
    Gibt es eine andere Möglichkeit, den Datenempfang zu beschleunigen?
    Das erhält es auch.
    Die Daten kommen ja auch an, allerdings viel zu langsam.
    Der PC scheint die ankommenden Daten in einen Speicher zu schreiben, nur die Auswertung mit serialPort1.ReadLine() dauert zu lange.
    Das kann man gut daran erkennen, das wenn ich die Datenausgabe an der Schaltung beende, der PC noch ewig weiter Daten auswertet (Weiß nicht wie Lange, Auswertung nach 2 min abgebrochen, Speicher dafür scheint ja recht groß zu sein ;) )

    Eierlein schrieb:

    serialPort1.ReadLine() erwartet standardmäßig ein vbCrLf am Ende.
    Ist so nicht ganz korrekt.
    Mit diesem Code wäre der String "bla" die Kennung für das Zeilenende:

    VB.NET-Quellcode

    1. Me.SerialPort1.NewLine = "bla"
    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!
    Danke, das werde ich mir mal anschauen.
    Wie stelle ich fest, das es an der GUI liegt?
    Habe zwar sehr viele Elemente eingebaut, allerdings macht das Programm bisher nur, den Empfangenen Inhalt mit Split in Variablen aufzuteilen und diese auf Labeln auszugeben. Das einzige was ich sonst dazu gefunden habe ist, readbyte() zu nutzen und dann die Zeile uqasi selber zusammenzusetzen. Muss da aber auch erstmal rumprobieren um das zum laufen zu bekommen.
    ReadByte wird sicherlich nicht schneller werden. Wenn dann musst du gepuffert lesen(wobei ich mir nicht sicher bin, ob das ReadLine nicht bereits macht).
    Ob es an der GUI liegt wirst du merken, wenn du BeginInvoke verwendest und das Problem nicht mehr besteht^^
    Ich denke nur, dass die Daten schneller ankommen, als dass sie angezeigt werden können.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Ok, ich muss halt gestehen, das ich so nicht die Ahnung davon habe. Habe mir die Hilfe dazu durchgelesen, und versucht umzusetzen. Hier ist mal der Auszug aus meinem programm:

    Quellcode

    1. [b]Hier wird Seriell Empfangen:[/b]
    2. Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    3. newString = SerialPort1.ReadLine.Trim
    4. Me.Invoke(Sub() UpdatePortData(newString))
    5. End Sub
    6. [b]Denn passiert das:[/b]
    7. Private Sub UpdatePortData(newString As String)
    8. Dim Splitted As String() = newString.Split("#")
    9. Dim count As Integer
    10. count = UBound(Splitted, 1) - LBound(Splitted, 1) + 1
    11. If count = 2 Then
    12. Adresse = Splitted(0)
    13. Wert = Splitted(1)
    14. If Adresse = "A001" Then
    15. Var_Licht_digital = Wert
    16. End If
    17. If cockpit.Visible Then
    18. cockpit.AGauge1.BeginInvoke(New InvokeDelegate(AddressOf InvokeMethod))
    19. End If
    20. End If
    21. ReDim Splitted(3)
    22. Adresse = ""
    23. Wert = ""
    24. newString = ""
    25. End Sub
    26. [b]Und schließlich das:[/b]
    27. Delegate Sub InvokeDelegate()
    28. Public Sub InvokeMethod()
    29. cockpit.AGauge1.Value = Var_Licht_digital
    30. End Sub


    Jetzt weiß ich nicht, ob das so ist, wie ihr meintet, jedenfalls funktioniert der Empfang so, allerdings ist er auch genauso langsam wie vorher.
    Liegt es nun an etwas anderem oder habe ich es falsch programmiert?
    das wird ja immer komischer.
    UBound/LBound sind überbleibsel aus VB6 raus damit. LBound ist außerdem immer 0, UBound ist der größte erreichbare Index, d.h. UBound +1==arr.Length->Verwende die Length Eigenschaft
    BeginInvoke kannst du genauso verwenden wie Invoke(wie du es beim DataReceived-Event verwendet hast)
    ReDim ist auch ein überbleibsel aus VB6, was mit arr.Resize, bzw. arr = new String() übereinstimmen dürfte. Aber warum sollte man das überhaupt tun? Das ist ein lokales Array, das danach sowieso gelöscht wird, ebenso die Variablen danach -> Zeile 27-30 bringen nichts, außer dass diese den Code langsamer machen.
    Hinzukommt, dass du nun den ganzen Code im GUI-Thread ausführst.
    Rufe deine UpdatePortData direkt und ohne Invoke auf.
    Aber ob dies das Problem löst, ist fraglich, ich kann mir gut vorstellen, dass da noch wesentlich mehr Fehler zu finden sind.

    Hast du Option Strict ON aktiviert?
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Danke für deine Antwort,

    Strict On habe ich nicht aktiviert. Es werden mir aber auch nur wenige Fehler ausgegeben, wenn ich es aktiviere (Integer in Combo-Box etc.)
    Length hatte ich mir angeguckt, dachte aber das es mir nur die Länge eines Strings ausgibt. Hier möchte ich ja wissen, wieviele Einträge das String-Array hat. Probiere ich mal aus, ob es damit doch geht.

    ReDim kann ich weglassen, stimmt. Weiß auch nicht mehr warum es da steht, wohl vom Probieren übrig geblieben...
    Ich probiere noch ein bischen. Aber an viel anderem kann es eig. nicht liegen, denn viel mehr ist noch nicht da ;)
    und trotzdem sind es Fehler. Option Strict sollte generell an sein->auftretende Fehler dann richtig beheben. Und nur weil eine Property gleich heißt, heißt das nicht, dass sie auf ein anderes Objekt anders reagiert.
    In .Net ist alles Objektorientiert. Die meisten Funktionen die auf ein Objekt angewendet werden und direkt mit diesem logisch zusammenhängen rufst du auch über das Objekt selbst auf.
    ReDim kann man nicht nur weglassen, man sollte es gar nicht mehr verwenden. Es gibt keinen Grund dazu.

    Und dann musst du natürlich noch die anderen Sachen entsprechend anwenden.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Ok, habe nun nochmal etwas "rumgespielt".
    Also Option Strict ist nun an und alle Fehler weg.
    Habe es nun trotzdem nicht geschafft. Was mir aber durch ausprobieren aufgefallen ist:

    Wenn ich meine Daten jeweils mit einer Pause von >1,4ms Sende, funktioniert das Programm genau wie es soll und quasi verzögerungsfrei.
    Bei 1,4 ms und weniger treten diese extremem Verzögerungen auf.
    Wenn ich nur einen Wert übertrage also "A001#xxxx" am Prozessor ankommt (xxxx Variabel) läuft es ebenfalls ohne Verzögerung durch.

    Werde noch mal weiter testen, aber vieleicht hilft es ja, den Fehler einzugrenzen. Gibt es bei Readline vieleicht eine minimalzeit, die zwischendurch eingehalten wird oder so?

    Dank & Gruß
    Dirk