Serialport auslesen

  • VB.NET

Es gibt 28 Antworten in diesem Thema. Der letzte Beitrag () ist von paco86.

    also die schnellste runde wird nun angezeigt. jedoch kommt immer noch der fehler nach den 20 runden "Ungültige Konvertierung von der Zeichenfolge AT GE in Typ Double."

    wie kann ich es machen ? das er mir bei der schnellste runden noch anzeigt von welchem spieler diese ist ?

    danke nochmal du hast mir schon ziemlich weitergeholfen.

    ach ja er aktuallisiert immer die textbox mit der schnellsten runde, kann man es auch so machen das er wirklich nur die eine schnellste runden anzeigt bis dann irgendwann wieder eine bessere kommt ?
    ich möchte dieses thema noch einmal kurz aufgreifen, und zwar habe ich noch ein letztes problem.

    Zurzeit speichere ich den inhalt der textbox welche die beste runde anzeigt in einer csv datei. Diese csv datei lese ich mir in einer unsichtbaren listbox ein und sortiere sie nach dem kleinsten wert und gebe mir diesen kleinsten wert dann ich einer textbox mit der Besten Streckenzeit aus.

    Nun zum Problem, Wenn ich z.b eine Beste Runde fahre, wird diese in der textbox mit der Bestenrunde angezeigt und in der csv datei gespeichert, das problem ist nun, das wenn ich keine neue beste runde fahre der wert der textbox mit der besten runde immer wieder neu geschrieben wird, folglich wird der wert bei einer zwanzig ründigen fahrt satte 150 mal in die textbox geschrieben.

    Wie kann ich es nun realisieren, das er mir nur einen wert in meine csv datei schreibt wenn dieser kleiner als der zuvorige wert der textbox ist ? die textbox mit der schnellsten runde wird also immer mit dem schnellsten wert beschrieben, auch dann wenn ich eine langsamere runde gefahren bin.

    evtl. kann man auch hier ansetzten und sagen wenn der wert spieler 1 oder spieler 2 kleiner als der beste rundenwert ist, erst dann neu in die textbox schreiben.

    vielen dank für eure bemühungen.
    Gruß Stefan
    Hier der ganze code


    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.IO.Ports
    3. Imports System.Threading
    4. Public Class Form1
    5. Private zählen As Integer = 20
    6. Dim WithEvents sp As New SerialPort
    7. Dim BesteRunde As String = ""
    8. Dim BesteRundeFahrer1 As String = ""
    9. Dim BesteRundeFahrer2 As String = ""
    10. Private Sub GetSerialPortNames()
    11. sp.BaudRate = 9600
    12. sp.PortName = "COM4"
    13. sp.Open()
    14. sp.DataBits = 8
    15. sp.Parity = Parity.None
    16. sp.StopBits = StopBits.One
    17. sp.Handshake = Handshake.None
    18. sp.Encoding = System.Text.Encoding.Default
    19. End Sub
    20. Sub ShowString(ByVal myString As String)
    21. txtIn.AppendText(myString & Environment.NewLine)
    22. End Sub
    23. Sub ShowString1(ByVal myString As String)
    24. txtIn1.AppendText(myString & Environment.NewLine)
    25. End Sub
    26. Sub ShowString3(ByVal myString As String)
    27. txtIn3.AppendText(myString & Environment.NewLine)
    28. End Sub
    29. Sub ShowString4(ByVal myString As String)
    30. txtIn4.AppendText(myString & Environment.NewLine)
    31. End Sub
    32. Sub ShowString5(ByVal myString As String)
    33. txtIn5.AppendText(myString & Environment.NewLine)
    34. End Sub
    35. Delegate Sub myMethodDelegate(ByVal [text] As String)
    36. Dim myDelegate As New myMethodDelegate(AddressOf ShowString)
    37. Delegate Sub MethodDelegate(ByVal [text] As String)
    38. Dim myDelegate2 As New myMethodDelegate(AddressOf ShowString1)
    39. Delegate Sub MethodDelegate3(ByVal [text] As String)
    40. Dim myDelegate3 As New myMethodDelegate(AddressOf ShowString3)
    41. Delegate Sub MethodDelegate4(ByVal [text] As String)
    42. Dim myDelegate4 As New myMethodDelegate(AddressOf ShowString4)
    43. Delegate Sub MethodDelegate5(ByVal [text] As String)
    44. Dim myDelegate5 As New myMethodDelegate(AddressOf ShowString5)
    45. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    46. GetSerialPortNames()
    47. Dim zeilen As String() = IO.File.ReadAllLines("Rundenzeiten.txt")
    48. For Each item As String In zeilen
    49. ListBox1.Items.Add(item)
    50. Next
    51. TextBox1.Lines = ListBox1.Items.Cast(Of String).ToArray
    52. End Sub
    53. Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    54. zählen = zählen + 10
    55. txtIn2.Text = zählen
    56. sp.Write("1")
    57. End Sub
    58. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    59. zählen = zählen + -10
    60. txtIn2.Text = zählen
    61. sp.Write("0")
    62. If zählen = 0 Then
    63. MsgBox("Rundenzahl kann nicht 0 sein, Bitte Rundenzahl erhöhen")
    64. End If
    65. End Sub
    66. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click, Button3.Click
    67. txtIn.Clear()
    68. txtIn1.Clear()
    69. txtIn3.Clear()
    70. txtIn4.Clear()
    71. txtIn5.Clear()
    72. End Sub
    73. Private Sub SerialPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles sp.DataReceived
    74. Dim str As String
    75. str = sp.ReadLine()
    76. Dim tmp As String = ""
    77. Static Beste As Double = 99
    78. Static Beste1 As Double = 99
    79. Static Beste2 As Double = 99
    80. If txtIn1.Text = "" And txtIn.Text = "" Then
    81. Beste = 99
    82. Beste1 = 99
    83. Beste2 = 99
    84. End If
    85. My.Computer.FileSystem.WriteAllText("Rundenzeiten.txt", txtIn3.Text, True)
    86. tmp = str.Substring(str.IndexOf("Rundenzeit") + 12, 6)
    87. tmp = tmp.Replace(":"c, ","c)
    88. If str.StartsWith("Spieler 1") Then
    89. Beste1 = Math.Min(Beste1, CDbl(tmp))
    90. Invoke(myDelegate, str)
    91. ElseIf str.StartsWith("Spieler 2") Then
    92. Beste2 = Math.Min(Beste2, CDbl(tmp))
    93. Invoke(myDelegate2, str)
    94. Else
    95. MsgBox(str)
    96. End If
    97. Beste = Math.Min(Beste1, Beste2)
    98. BesteRunde = Beste.ToString
    99. BesteRundeFahrer1 = Beste1.ToString
    100. BesteRundeFahrer2 = Beste2.ToString
    101. Invoke(myDelegate3, " " + BesteRunde + " Sek.")
    102. Invoke(myDelegate4, " " + BesteRundeFahrer1 + " Sek.")
    103. Invoke(myDelegate5, " " + BesteRundeFahrer2 + " Sek.")
    104. End Sub
    105. Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    106. sp.Write("4")
    107. Thread.Sleep(3850)
    108. My.Computer.Audio.Play(My.Resources.ampelrot,
    109. AudioPlayMode.WaitToComplete)
    110. Thread.Sleep(850)
    111. My.Computer.Audio.Play(My.Resources.ampelrot,
    112. AudioPlayMode.WaitToComplete)
    113. Thread.Sleep(850)
    114. My.Computer.Audio.Play(My.Resources.ampelrot,
    115. AudioPlayMode.WaitToComplete)
    116. Thread.Sleep(850)
    117. My.Computer.Audio.Play(My.Resources.ampelrot,
    118. AudioPlayMode.WaitToComplete)
    119. Thread.Sleep(850)
    120. My.Computer.Audio.Play(My.Resources.ampelrot,
    121. AudioPlayMode.WaitToComplete)
    122. Thread.Sleep(800)
    123. My.Computer.Audio.Play(My.Resources.ampelgrün,
    124. AudioPlayMode.WaitToComplete)
    125. End Sub
    126. End Class


    Und hier mit empfange und schreibe ich die daten in die textboxen.

    VB.NET-Quellcode

    1. Private Sub SerialPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles sp.DataReceived
    2. Dim str As String
    3. str = sp.ReadLine()
    4. Dim tmp As String = ""
    5. Static Beste As Double = 99
    6. Static Beste1 As Double = 99
    7. Static Beste2 As Double = 99
    8. If txtIn1.Text = "" And txtIn.Text = "" Then
    9. Beste = 99
    10. Beste1 = 99
    11. Beste2 = 99
    12. End If
    13. My.Computer.FileSystem.WriteAllText("Rundenzeiten.txt", txtIn3.Text, True)
    14. tmp = str.Substring(str.IndexOf("Rundenzeit") + 12, 6)
    15. tmp = tmp.Replace(":"c, ","c)
    16. If str.StartsWith("Spieler 1") Then
    17. Beste1 = Math.Min(Beste1, CDbl(tmp))
    18. Invoke(myDelegate, str)
    19. ElseIf str.StartsWith("Spieler 2") Then
    20. Beste2 = Math.Min(Beste2, CDbl(tmp))
    21. Invoke(myDelegate2, str)
    22. Else
    23. MsgBox(str)
    24. End If
    25. Beste = Math.Min(Beste1, Beste2)
    26. BesteRunde = Beste.ToString
    27. BesteRundeFahrer1 = Beste1.ToString
    28. BesteRundeFahrer2 = Beste2.ToString
    29. Invoke(myDelegate3, " " + BesteRunde + " Sek.")
    30. Invoke(myDelegate4, " " + BesteRundeFahrer1 + " Sek.")
    31. Invoke(myDelegate5, " " + BesteRundeFahrer2 + " Sek.")
    32. End Sub


    er soll halt immer nur eine neue zeit in die textboxen schreiben, wenn die letzt unterboten wurde also kürzer ist.

    Viel Dank
    Versuch's mal damit:

    VB.NET-Quellcode

    1. ...
    2. ...
    3. Static BesteBeste As Double = 99
    4. Static BesteBeste1 As Double = 99
    5. Static BesteBeste2 As Double = 99
    6. ...
    7. ...
    8. ...
    9. ...
    10. Beste = Math.Min(Beste1, Beste2)
    11. BesteRunde = Beste.ToString
    12. BesteRundeFahrer1 = Beste1.ToString
    13. BesteRundeFahrer2 = Beste2.ToString
    14. If Beste < BesteBeste then
    15. Invoke(myDelegate3, " " + BesteRunde + " Sek.")
    16. End If
    17. If Beste1 < BesteBeste1 then
    18. Invoke(myDelegate4, " " + BesteRundeFahrer1 + " Sek.")
    19. End If
    20. If Beste2 < BesteBeste2 then
    21. Invoke(myDelegate5, " " + BesteRundeFahrer2 + " Sek.")
    22. End If
    23. End Sub
    werd ich nachher machen, dafür schonmal besten dank,

    jedoch verstehe ich den vergleich

    VB.NET-Quellcode

    1. If Beste < BesteBeste
    nicht, BesteBeste müsste doch immer den alten wert der textbox haben oder etwa nicht ?

    in dem code bekommt BesteBeste doch nur den Wert 99 zugeteilt.
    BesteBeste müsste doch immer den alten wert der textbox haben oder etwa nicht ?

    Hast' recht.
    So müsste es klappen:

    VB.NET-Quellcode

    1. ...
    2. If Beste < BesteBeste then
    3. BesteBeste = Beste
    4. Invoke(myDelegate3, " " + BesteRunde + " Sek.")
    5. End If
    6. If Beste1 < BesteBeste1 then
    7. BesteBeste1 = Beste1
    8. Invoke(myDelegate4, " " + BesteRundeFahrer1 + " Sek.")
    9. End If
    10. If Beste2 < BesteBeste2 then
    11. BesteBeste2 = Beste2
    12. Invoke(myDelegate5, " " + BesteRundeFahrer2 + " Sek.")
    13. End If
    merci !
    ich probiers später hab noch vorlesung.

    Wenn das ganze dann fertig ist setzt ich es mal komplett rein, damit auch andere dies nutzen können.
    Danke !

    Wie könnte ich es realisieren, das wenn die Zeit in textbox besterunde kleiner ist als die in meiner streckenbestzeit eine aufforderung kommt, in dem man den namen eintragen muss und dieser dann als label geändert wird,

    zb. Neue Streckenbestzeit ! Bitte name eintragen.

    sodass dann dort steht Streckenbestzeit gefahren von Name

    Ich dachte an soetwas:

    VB.NET-Quellcode

    1. If MsgBox contains GEWONNEN And TextboxBeste < TextboxStreckenbeste Then
    2. MsgBox("Neue Streckenbestzeit, Bitte Name eintragen")
    3. Dann Hier das label in den Name ändern.
    4. End If


    das mit MsgBox gewonnen ist drin, damit er erst am ende des Rennens sagt bitte name eintragen.

    Das ist mein Ansatz:

    VB.NET-Quellcode

    1. Dim name As String = "Spieler"
    2. If txtIn3.Text < TextBox1.Text And MsgBox("GEWONNEN") Then
    3. MsgBox("Neue Streckenbestzeit, Bitte Name eintragen")
    4. name = InputBox("Bitte geben sie Ihr Passwort ein", "name")
    5. End If
    6. Label3.Text = name

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „paco86“ ()

    so ich musste noch eine kleinigkeit ändern, jetzt klappt es. Vielen dank dafür.


    Das mit der eingabe des Spielernamen bei neuer Streckernbestzeit klappt auch soweit, jedoch soll er es erst am ende des rennens machen, also wenn die MsgBox sagt Spieler x HAT GEWONNEN.

    ich hab auch schon versucht es so zu machen, das wenn str.EndsWith("GEWONNEN") jedoch fragt er mich dann am ende nicht nach der eingabe des namens!

    Hat da jemand eine Idee ?

    Hier mein Code

    VB.NET-Quellcode

    1. Private Sub SerialPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles sp.DataReceived
    2. Dim str As String
    3. str = sp.ReadLine()
    4. Dim Bestername As String = ""
    5. Dim tmp As String = ""
    6. Static Beste As Double = 99
    7. Static Beste1 As Double = 99
    8. Static Beste2 As Double = 99
    9. Static BesteBeste As Double = 99
    10. Static BesteBeste1 As Double = 99
    11. Static BesteBeste2 As Double = 99
    12. If txtIn1.Text = "" And txtIn.Text = "" Then
    13. Beste = 99
    14. Beste1 = 99
    15. Beste2 = 99
    16. End If
    17. tmp = str.Substring(str.IndexOf("Rundenzeit") + 12, 6)
    18. tmp = tmp.Replace(":"c, ","c)
    19. If str.StartsWith("Spieler 1") Then
    20. Beste1 = Math.Min(Beste1, CDbl(tmp))
    21. Invoke(myDelegate, str)
    22. ElseIf str.StartsWith("Spieler 2") Then
    23. Beste2 = Math.Min(Beste2, CDbl(tmp))
    24. Invoke(myDelegate2, str)
    25. Else
    26. MsgBox(str)
    27. End If
    28. Beste = Math.Min(Beste1, Beste2)
    29. BesteRunde = Beste.ToString
    30. BesteRundeFahrer1 = Beste1.ToString
    31. BesteRundeFahrer2 = Beste2.ToString
    32. If Beste < BesteBeste Then
    33. BesteBeste = Beste
    34. Invoke(myDelegate6, "")
    35. Invoke(myDelegate3, " " + BesteRunde + " Sek.")
    36. My.Computer.FileSystem.WriteAllText("Rundenzeiten.txt", txtIn3.Text, True)
    37. End If
    38. If Beste1 < BesteBeste1 Then
    39. BesteBeste1 = Beste1
    40. Invoke(myDelegate7, "")
    41. Invoke(myDelegate4, " " + BesteRundeFahrer1 + " Sek.")
    42. End If
    43. If Beste2 < BesteBeste2 Then
    44. BesteBeste2 = Beste2
    45. Invoke(myDelegate8, "")
    46. Invoke(myDelegate5, " " + BesteRundeFahrer2 + " Sek.")
    47. End If
    48. If txtIn3.Text < TextBox1.Text And str.EndsWith("GEWONNEN") Then
    49. MsgBox("Neue Streckenbestzeit, Bitte Name eintragen")
    50. Bestername = InputBox("Bitte geben Ihren Namen ein", "Bestername")
    51. Invoke(myDelegate10, "")
    52. Invoke(myDelegate9, Bestername)
    53. End If
    54. End Sub


    der untere code ist für den input zuständig

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