Serialport auslesen

  • VB.NET

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

    Serialport auslesen

    Guten Morgen und Frohe Weihnachten an alle!

    Ich habe auf meinem Arduino Uno ein Programm am laufen. Dieses Programm ermöglicht mir das Zähler von Runden sowie das messen der jeweiligen Rundenzeiten von zwei spieler. Das ganze kann ich mir dann auf dem Serial Monitor anzeigen lassen.

    Nun möchte ich das ganze etwas anschulicher gestalten und möchte die sachen über den serialen port auslesen.
    Das klappt auch.

    Nun zu meinem Problem, ich habe ich einem Fenster zwei textboxen, die linke ist für spieler 1 und die rechte für spieler zwei.
    Zurzeit werden alle eregnise an die linke textbox für spieler eins geleitet.

    Ich möchte es jedoch so haben, das alles was für spieler eins ausgelsen wird in die linke und das für spieler zwei in die rechte textbox ausgelsen wird.

    Ich hab bereits versucht das ganze mit verschiedenen baudrate zu machen.

    Spieler 1: Baudrate 4800
    Spieler 2: Baudrate 9600

    sodass ich es mir über verschiedene baudrates in die jeweiligen textboxen auslesen kann, dieses schaffe ich jedoch nicht und weiss nicht wie ich es anstellen soll, evtl. gibts auch bessere lösungen.

    Ich habe bereits den ganzen letzten abend damit verbracht foren und andere beiträge durchzublättern sodass ich leider nicht zum ergebnis kommen konnte.

    Auch bin ich ein freund der suchmaschinen und werden auch immer fündig sodass ich nur sehr selten neue themen beginne.
    dies wollte ich nur vorweg nehmen damit niemand sofort fragt :"Suchfunktion benutzt ?"

    Ich wäre über tipps, codes.... sehr dankbar.

    Das ganze soll später über das VB programm anschasulich dargestellt werden und die Rundenzeiten etc. meine carrera anzeigen.

    Ein Frohes Fest.
    Gruß STefan



    Hier mein Arduino Programm:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. /* StopWatch
    2. * Paul Badger 2008
    3. * Demonstrates using millis(), pullup resistors,
    4. * making two things happen at once, printing fractions
    5. *
    6. * Physical setup: momentary switch connected to pin 4, other side connected to ground
    7. * LED with series resistor between pin 13 and ground
    8. */
    9. #define ledPin A3 // LED connected to digital pin 13
    10. int Lichtschranke1 = A1; // oder Taster
    11. int Lichtschranke2 = A2;
    12. int Runde1 = 0;
    13. int Runde2 = 0;
    14. int Ton = 11;
    15. int value1 = LOW; // previous value of the LED
    16. int value2 = LOW; // previous value of the LED
    17. int buttonState1; // variable to store button state
    18. int buttonState2; // variable to store button state
    19. int lastButtonState1; // variable to store last button state
    20. int lastButtonState2; // variable to store last button state
    21. int blinking1; // condition for blinking - timer is timing
    22. int blinking2; // condition for blinking - timer is timing
    23. long interval1 = 100; // blink interval - change to suit
    24. long interval2 = 100; // blink interval - change to suit
    25. long previousMillis1 = 0; // variable to store last time LED was updated
    26. long previousMillis2 = 0; // variable to store last time LED was updated
    27. long start1 ; // start time for stop watch
    28. long dauer1 ; // elapsed time for stop watch
    29. long start2 ; // start time for stop watch
    30. long dauer2 ; // elapsed time for stop watch
    31. int fractional1; // variable used to store fractional part of time
    32. int fractional2; // variable used to store fractional part of time
    33. #include <LiquidCrystal.h>
    34. int Reset = 9;
    35. LiquidCrystal lcd(10,11,12,13,14,15,16);
    36. void setup()
    37. {
    38. lcd.begin(16, 2);
    39. pinMode(ledPin, OUTPUT); // sets the digital pin as output
    40. pinMode(Lichtschranke1, INPUT); // not really necessary, pins default to INPUT anyway
    41. pinMode(Lichtschranke2, INPUT); // not really necessary, pins default to INPUT anyway
    42. digitalWrite(Lichtschranke1, HIGH); // turn on pullup resistors. Wire button so that press shorts pin to ground.
    43. digitalWrite(Lichtschranke2, HIGH); // turn on pullup resistors. Wire button so that press shorts pin to ground.
    44. pinMode(Reset,INPUT);
    45. }
    46. void loop()
    47. {
    48. //LICHTSCHRANKE 2
    49. // check for button press
    50. buttonState2 = digitalRead(Lichtschranke2); // read the button state and store
    51. if (buttonState2 == LOW && lastButtonState2 == HIGH && blinking2 == false){ // check for a high to low transition
    52. // if true then found a new button press while clock is not running - start the clock
    53. start2 = millis(); // store the start time
    54. blinking2 = true; // turn on blinking while timing
    55. // short delay to debounce switch
    56. lastButtonState2 = buttonState2; // store buttonState in lastButtonState, to compare next time
    57. }
    58. else if (buttonState2 == LOW && lastButtonState2 == HIGH && blinking2 == true){ // check for a high to low transition
    59. // if true then found a new button press while clock is running - stop the clock and report
    60. Runde2++; // Inkrementieren der Variablen Runde
    61. dauer2 = millis() - start2; // store elapsed time
    62. blinking2 = false; // turn off blinking, all done timing
    63. Serial.begin(9600);
    64. Serial.print("Spieler 2 - Runde: ");
    65. Serial.print(Runde2);
    66. // routine to report elapsed time
    67. Serial.print(" Rundenzeit: ");
    68. Serial.print((int)(dauer2)/1000L); // divide by 1000 to convert to seconds - then cast to an int to print
    69. Serial.print("."); // print decimal point
    70. // use modulo operator to get fractional part of time
    71. fractional2 = (int)(dauer2 % 1000L);
    72. // pad in leading zeros - wouldn't it be nice if
    73. // Arduino language had a flag for this? :)
    74. if (fractional2 == 0)
    75. Serial.print("000"); // add three zero's
    76. else if (fractional2 < 10) // if fractional < 10 the 0 is ignored giving a wrong time, so add the zeros
    77. Serial.print("00"); // add two zeros
    78. else if (fractional2 < 100)
    79. Serial.print("0"); // add one zero
    80. if(digitalRead(Reset) == HIGH){
    81. Runde2=0;}
    82. Serial.println(fractional2); // print fractional part of time
    83. }
    84. else{
    85. lastButtonState2 = buttonState2; // store buttonState in lastButtonState, to compare next time
    86. }
    87. // blink routine - blink the LED while timing
    88. // check to see if it's time to blink the LED; that is, the difference
    89. // between the current time and last time we blinked the LED is larger than
    90. // the interval at which we want to blink the LED.
    91. if ( (millis() - previousMillis2 > interval2) ) {
    92. if (blinking2 == true){
    93. previousMillis2 = millis(); // remember the last time we blinked the LED
    94. // if the LED is off turn it on and vice-versa.
    95. if (value2 == LOW)
    96. value2 = HIGH;
    97. else
    98. value2 = LOW;
    99. digitalWrite(ledPin, value2);
    100. }
    101. else{
    102. digitalWrite(ledPin, LOW); // turn off LED when not blinking
    103. }
    104. }
    105. if(Runde2==20){
    106. digitalWrite(ledPin, HIGH);
    107. Runde2=0;
    108. Serial.print("");
    109. Serial.println("SPIELER 2 HAT GEWONNEN");
    110. delay(5000);}
    111. //LICHTSCHRANKE 1
    112. // check for button press
    113. buttonState1 = digitalRead(Lichtschranke1); // read the button state and store
    114. if (buttonState1 == LOW && lastButtonState1 == HIGH && blinking1 == false){ // check for a high to low transition
    115. // if true then found a new button press while clock is not running - start the clock
    116. start1 = millis(); // store the start time
    117. blinking1 = true; // turn on blinking while timing
    118. // short delay to debounce switch
    119. lastButtonState1 = buttonState1; // store buttonState in lastButtonState, to compare next time
    120. }
    121. else if (buttonState1 == LOW && lastButtonState1 == HIGH && blinking1 == true){ // check for a high to low transition
    122. // if true then found a new button press while clock is running - stop the clock and report
    123. Runde1++; // Inkrementieren der Variablen Runde
    124. dauer1 = millis() - start1; // store elapsed time
    125. blinking1 = false; // turn off blinking, all done timing
    126. Serial.begin(4800);
    127. Serial.print("Spieler 1 - Runde: ");
    128. Serial.print(Runde1);
    129. // routine to report elapsed time
    130. Serial.print(" Rundenzeit: ");
    131. Serial.print((int)(dauer1 / 1000L)); // divide by 1000 to convert to seconds - then cast to an int to print
    132. Serial.print("."); // print decimal point
    133. // use modulo operator to get fractional part of time
    134. fractional1 = (int)(dauer1 % 1000L);
    135. // pad in leading zeros - wouldn't it be nice if
    136. // Arduino language had a flag for this? :)
    137. if (fractional1 == 0)
    138. Serial.print("000"); // add three zero's
    139. else if (fractional1 < 10) // if fractional < 10 the 0 is ignored giving a wrong time, so add the zeros
    140. Serial.print("00"); // add two zeros
    141. else if (fractional1 < 100)
    142. Serial.print("0"); // add one zero
    143. Serial.print(fractional1);
    144. Serial.println("ms"); // print fractional part of time
    145. }
    146. else{
    147. lastButtonState1 = buttonState1; // store buttonState in lastButtonState, to compare next time
    148. }
    149. // blink routine - blink the LED while timing
    150. // check to see if it's time to blink the LED; that is, the difference
    151. // between the current time and last time we blinked the LED is larger than
    152. // the interval at which we want to blink the LED.
    153. if ( (millis() - previousMillis1 > interval1) ) {
    154. if (blinking1 == true){
    155. previousMillis1 = millis(); // remember the last time we blinked the LED
    156. // if the LED is off turn it on and vice-versa.
    157. if (value1 == LOW)
    158. value1 = HIGH;
    159. else
    160. value1 = LOW;
    161. digitalWrite(ledPin, value1);
    162. }
    163. else{
    164. digitalWrite(ledPin, LOW); // turn off LED when not blinking
    165. }
    166. }
    167. if(Runde1==20){
    168. Runde1=0;
    169. Serial.print("");
    170. Serial.println("SPIELER 1 HAT GEWONNEN");
    171. delay(5000);}
    172. }



    Hier das VB Programm:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.IO.Ports
    2. Public Class Form1
    3. Dim WithEvents sp As New SerialPort
    4. Private Sub GetSerialPortNames()
    5. sp.BaudRate = 4800
    6. sp.PortName = "COM4"
    7. sp.Open()
    8. End Sub
    9. Sub ShowString(ByVal myString As String)
    10. txtIn.AppendText(myString)
    11. End Sub
    12. Delegate Sub myMethodDelegate(ByVal [text] As String)
    13. Dim myDelegate As New myMethodDelegate(AddressOf ShowString)
    14. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    15. GetSerialPortNames()
    16. End Sub
    17. Private Sub SerialPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles sp.DataReceived
    18. Dim str As String = sp.ReadExisting()
    19. Invoke(myDelegate, str)
    20. End Sub
    21. Private Sub txtIn_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtIn.TextChanged
    22. End Sub
    23. End Class


    *Posting ausgelagert*

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Es wird ja jeweils immer spieler 1 und spieler 2 angezeigt, jedoch bekomme ich die zeichen in vb nicht ausgelsen und in die beiden boxen geschrieben.
    Ich bin die ganze zeit am lesen und probieren, jedoch ohne erfolg!

    So sieht es zurzeit aus:
    Ich bekomme die Daten von Spieler 2 einfach nicht in die Rechte Textbox !

    Für Spieler 1 habe ich es schon mit $
    Und Spieler 2 mit % versucht.

    kann mir evtl. jemand ein beispiel nenen wie ich das ganze mit besagten zeichen trennen könnte ?

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

    wie speicher ich den text als variable ?


    muss das ganze dann hier rein ?

    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.ReadExisting()
    4. End Sub



    hiermit wird er in die linke textbox geschrieben

    VB.NET-Quellcode

    1. Sub ShowString(ByVal myString As String)
    2. txtIn.AppendText(myString)
    3. End Sub
    4. Delegate Sub myMethodDelegate(ByVal [text] As String)
    5. Dim myDelegate As New myMethodDelegate(AddressOf ShowString)


    textbox rechts ist dann
    txtIn1.AppendText(myString)

    Es wäre nett wenn du mir ein Beispiel schicken könntest da ich es mir nicht ganz vorstellen kann.

    Und vielen Danke für deine Bemühung !



    Das habe ich bereits prbiert. Jedoch wenn spieler 1 betätigt kommt die Msgbox Spieler 1 und danach sofort Spieler 2, obwohl der String mit $ für spieler 1 und % für spieler 2 beginnt.

    Im Arduino Programm habe ich Spieler 1 durch § ersetzt. siehe erster Post.


    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 P1 As String = str.StartsWith("$")
    5. MsgBox("Spieler 1")
    6. Dim P2 As String = str.StartsWith("%")
    7. MsgBox("Spieler 2")
    8. End Sub


    Jetzt leg ich mich erstmal hin und hoffe morgen zum ziel zu kommen.
    Danke für die Hilfe.

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

    Guten Abend/Morgen,

    Die StarsWith-Methode gibt einen Boolean zurück. Heißt also, dass du hier mit einem konditionalen Konstrukt - auch bekannt als If - arbeiten musst. So würde es z.B. lauten:

    VB.NET-Quellcode

    1. If P1.StartsWith("$") Then
    2. ' Hier in TextBox1 reinschreiben
    3. Else
    4. ' Hier in TextBox2 reinschreiben
    5. End If


    Das ganze halt in das DataReceive-Event vom SerialPort.
    Guten Morgen und vielen Dank dafür,
    genau so hatte ich es gestern kurz, jedoch habe ich als Spieler 1 versehentlich ein § statt eines $ Zeichens empfangen sodass dies nicht funktionierte.

    Jetzt klappt es zumindest schonmal mit den MsgBoxen, in denen jeweils die werte von Spieler 1 und Spieler 2 stehen wenn diese auslösen.

    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 P1 As String = str
    5. Dim P2 As String = str
    6. If P1.StartsWith("$") Then
    7. txtIn.AppendText(P1)
    8. Else
    9. txtIn.AppendText(P2)
    10. End If
    11. End Sub


    So sieht das ganze mit den Textboxen aussehen.
    jedoch kommt immer die folgende fehlermeldung. :S

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

    So ich habe es nun hinbekommen, das einzige was mich noch stört ist, das nun die texte in den textboxen hintereinander weggeschrieben werden,
    Sie werden mir jetzt nicht mehr untereinander ausgegeben.

    Ich finde den fehler leider nicht. Wenn mir dabei noch jemand helfen könnte wäre ich euch sehr dankbar !

    hier mein aktueller code !

    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. Private Sub GetSerialPortNames()
    8. sp.BaudRate = 9600
    9. sp.PortName = "COM4"
    10. sp.Open()
    11. sp.DataBits = 8
    12. sp.Parity = Parity.None
    13. sp.StopBits = StopBits.One
    14. sp.Handshake = Handshake.None
    15. sp.Encoding = System.Text.Encoding.Default
    16. End Sub
    17. Sub ShowString(ByVal myString As String)
    18. txtIn.AppendText(myString)
    19. End Sub
    20. Sub ShowString1(ByVal myString As String)
    21. txtIn1.AppendText(myString)
    22. End Sub
    23. Delegate Sub myMethodDelegate(ByVal [text] As String)
    24. Dim myDelegate As New myMethodDelegate(AddressOf ShowString)
    25. Delegate Sub MethodDelegate(ByVal [text] As String)
    26. Dim myDelegate2 As New myMethodDelegate(AddressOf ShowString1)
    27. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    28. GetSerialPortNames()
    29. End Sub
    30. Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    31. zählen = zählen + 10
    32. txtIn2.Text = zählen
    33. sp.Write("1")
    34. End Sub
    35. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    36. zählen = zählen + -10
    37. txtIn2.Text = zählen
    38. sp.Write("0")
    39. If zählen = 0 Then
    40. MsgBox("Rundenzahl kann nicht 0 sein, Bitte Rundenzahl erhöhen")
    41. End If
    42. End Sub
    43. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    44. sp.Write("2")
    45. txtIn.Clear()
    46. txtIn1.Clear()
    47. End Sub
    48. Private Sub SerialPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles sp.DataReceived
    49. Dim str As String
    50. str = sp.ReadLine()
    51. Dim P1 As String = str
    52. Dim P2 As String = str
    53. If P1.StartsWith("Spieler 1") Then
    54. Invoke(myDelegate, P1)
    55. Else
    56. Invoke(myDelegate2, P2)
    57. End If
    58. End Sub
    59. End Class
    hat keiner einen Tipp ? Ich hab schon diverse foreneinträge durch.
    Danke Gruss Stefan

    Habs hinbekommen.

    VB.NET-Quellcode

    1. Sub ShowString(ByVal myString As String)
    2. txtIn.AppendText(myString & Environment.NewLine)
    3. End Sub



    Gibt es die möglichkeit noch die z.b kleinste Zahl in den textboxen zu finden und diese in eine dritte textbox anzuzeigen ?

    Er soll nämliche die niedrigste rundenzeit finden und diese dann in textbox 3 ausgeben.

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

    Hi Paco, sorry für die verspätete Antwort nachträglich frohe weihnachten.

    Also ich hab es lösen können und zwar durch setzen einer Anfangsmarkierung z.b. ====begin==== und endmarkierung ====end====.
    dann habe ich zeile für zeile das eingelesen und die Zeile wo ===begin=== und die zeile wo ====end==== vorkam immer notiert.
    Dann habe ich gesagt, dass der inhalt zwischen den Markierungen in die zweite Textbox auch erscheinen soll.

    Wichtig: Bei mir wurde dieser Inhalt separat in der 2.Textbox angezeigt und auch in der 1.Textbox.

    Schau hier mal:

    VB.NET-Quellcode

    1. Private Sub DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort_i2c.DataReceived
    2. 'das was an buffer ist wird an variable drangehängt und somit nicht ueberschrieben
    3. inputdata = inputdata & SerialPort_i2c.ReadExisting
    4. 'HIer wird die funktion aufgerufen, weil damit gibt eskeine verzögerung,
    5. 'd.h. da wird alles was im EMpfangsbuffer anliegt ausgelesen und ausgegeben. -> brauche im Event vom Button klick nicht definieren
    6. 'da arduino nur sendet wenn er Dollarzeichen erhält, also -> receive, da kommt erst eventhandler datarecieved zum arbeiten
    7. Me.Invoke(Sub() Me.DoIt())
    8. End Sub
    9. Private Sub DoIt()
    10. Dim beginningLine As Integer 'notiere Zeilenzahl vom arry wo ===file begin kommt
    11. Dim endLine As Integer 'notiere Zeilenzahl vom array wo ===end== kommt
    12. Dim WerteArray() As String = Split(inputdata, Environment.NewLine)
    13. 'Befülle Array mit den Zeilen der RTB mit zeilenweise
    14. RichTextBox1.Clear() 'lösche richttextbox
    15. For i = 0 To WerteArray.Length - 1 ' i sind die zeilen
    16. 'For Each line As String In WerteArray 'überprüfe jede zeile auf ===file content=== und ===end ===
    17. Select Case WerteArray(i)
    18. Case "===file content===" 'wenn gefunden
    19. beginningLine = i 'notiere zeile wo file content vorkommt
    20. Case "===end==="
    21. endLine = i 'notiere Zeile wo end vorkommt
    22. Case Else
    23. RichTextBox1.AppendText(WerteArray(i) & vbCr) 'sonst schriebe in richtextbox 'vbCrlF
    24. End Select
    25. Next
    26. If beginningLine >= 0 Then 'wenn beginnline >=0 , d.h. wenn 0 oder grösser bedeutet zeile gefunden
    27. listbox_i2c_editparameter.BeginUpdate() 'friert box ein sodass man bei langsamen rechner das nicht sieht wegen update
    28. listbox_i2c_editparameter.Items.Clear() 'wird nicht drangehängt sondern gelöscht und immer neues angezeigt in listbox
    29. For i As Integer = (beginningLine + 2) To (endLine - 1) ' trage die zeilen ein von beginning+2 d.h. wo der erste param anfängt line bis letzte param also endline-1
    30. listbox_i2c_editparameter.Items.Add(WerteArray(i)) 'füge zeilen von beign to end in listbox
    31. Next
    32. listbox_i2c_editparameter.EndUpdate() 'bende update
    33. RichTextBox1.ScrollToCaret() 'sodass er runterscroll und das aktuellste zeigt
    34. End If
    35. '----wenn Gui empfängt, dann lade die Progressbar auf 100 %-------'
    36. '-----d.h. hier ist progress =1 --------'
    37. progress = 1
    38. Progress_i2c.Value = 100
    39. 'wenn ich erneut drücke, d.h die progress var =1 dann erneut laden----'
    40. 'd.h. zuerst auf 0 und dann wieder auf 100%
    41. If progress = 1 Then
    42. Progress_i2c.Value = 0
    43. Progress_i2c.Value = 100
    44. End If
    45. End Sub




    Sorry sehe schon da haben einige schon weitergeholfen, doch schaden kann es trotzdem nicht. Und helf gerne weiter.
    Falls du fragen dazu hast frag mich ruhig :D.
    evtl. kannst du mir bei meinem letzten beitrag weiterhelfen, ich möchte die niedrigste zahl aus meinen beiden textboxen ermitteln und diese dann in eine dritte textbox schreiben lassen.
    Die Textbox soll dann die schnellste runde anzeigen. evtl sogar so.

    Beste Rundenzeit Spieler 1
    Beste Rundenzeit Spieler 2
    und dann noch die ingesamt beste runden zeit.
    Als Anregung:
    (Für die TextBox Werte in String wandeln).

    VB.NET-Quellcode

    1. Module Module1
    2. Sub Main()
    3. Dim Beste As Double = 99
    4. Dim Beste1 As Double = 99
    5. Dim Beste2 As Double = 99
    6. Dim t(3) As String, tmp As String
    7. t(0) = "Spieler 1 Runde Rundenzeit: 0:328 Sek."
    8. t(1) = "Spieler 2 Runde Rundenzeit: 0:424 Sek."
    9. t(2) = "Spieler 2 Runde Rundenzeit: 1:101 Sek."
    10. t(3) = "Spieler 1 Runde Rundenzeit: 0:498 Sek."
    11. For i As Integer = 0 To 3
    12. tmp = t(i).Substring(t(i).IndexOf("Rundenzeit") + 12, 5)
    13. tmp = tmp.Replace(":"c, ","c)
    14. If t(i).Contains("Spieler 1") Then
    15. Beste1 = Math.Min(Beste1, CDbl(tmp))
    16. ElseIf t(i).Contains("Spieler 2") Then
    17. Beste2 = Math.Min(Beste2, CDbl(tmp))
    18. End If
    19. Next
    20. Beste = Math.Min(Beste1, Beste2)
    21. Debug.Print("Beste - " & Beste)
    22. Debug.Print("Beste1 - " & Beste1)
    23. Debug.Print("Beste2 - " & Beste2)
    24. End Sub
    25. End Module
    Danke ! aber wie lasse ich mir das ganze nun in einer einer dritten textbox anzeigen ?

    meine textbox habe ich wie folgt benannt

    txtIn1
    txtIn2
    u.s.w

    so soll es am ende dann aussehen.

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

    paco86 schrieb:

    evtl. kannst du mir bei meinem letzten beitrag weiterhelfen, ich möchte die niedrigste zahl aus meinen beiden textboxen ermitteln und diese dann in eine dritte textbox schreiben lassen.
    Die Textbox soll dann die schnellste runde anzeigen. evtl sogar so.

    Beste Rundenzeit Spieler 1
    Beste Rundenzeit Spieler 2
    und dann noch die ingesamt beste runden zeit.
    Hi gerne versuche ich dir zu helfen.
    Also meine Idee war es die textboxen (also den Inhalt) zu überprüfen and von > bzw < zu vergleichen und dann das kleinste in der textbox 3 anzeigen zu lassen.

    Also in etwa so:
    If textbox1.Text > textbox2.Text Then
    ' Passiert was
    End If

    Schau mal unter diesem link:

    [VB 2010] Zahlen vergleich (größer als)


    als kleiner Ansatz, doch ich glaube du hast da ja mehrere d.h. man müsste mehrere Vergleiche machen also so in etwa:


    Wenn Runde 1 Sp1 > Runde 1 SP2 , dann..... usw.


    Habe es aber selber nicht ausprobiert, dass war ein Einfall wie ich das auch versuchen würde.
    Kann dir das weiterhelfen?

    ich habs eben mal kurz versucht das mit dem if text 1 größer text 2 klappt, aber nur wenn ich in textbox drei reingehe und kurz einen buchstaben drücke.
    er aktualisiert jedoch die werte, er soll es aber so machen das er die kleinste von allen nimmt und diese dann dauerhaft anzeigt, solange bis wieder von spieler 1 oder 2 eine neue bestzeit gefahren wurde.

    aber der ansatz ist schonmal nicht schlecht, da müsste dan warscheinlich soetwas wie math.min klappen oder so. leider schaffe ich heute icht mehr es zu probieren. ich werde mich aber melden.
    vielen dank schonmal !!!

    so sieht es im mom aus. jetzt ist es zusätzlich auch noch so das sobald spieler 2 einmal eine schnellere runde gefahren ist, er auch runden anzeigt die eigentlich länger waren

    VB.NET-Quellcode

    1. Private Sub txtIn3_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtIn3.TextChanged
    2. If txtIn.Text > txtIn1.Text Then
    3. txtIn3.Text = txtIn.Text
    4. Else
    5. txtIn3.Text = txtIn1.Text
    6. End If
    7. End Sub

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

    paco86 schrieb:

    ich habs eben mal kurz versucht das mit dem if text 1 größer text 2 klappt, aber nur wenn ich in textbox drei reingehe und kurz einen buchstaben drücke.
    er aktualisiert jedoch die werte, er soll es aber so machen das er die kleinste von allen nimmt und diese dann dauerhaft anzeigt, solange bis wieder von spieler 1 oder 2 eine neue bestzeit gefahren wurde.

    aber der ansatz ist schonmal nicht schlecht, da müsste dan warscheinlich soetwas wie math.min klappen oder so. leider schaffe ich heute icht mehr es zu probieren. ich werde mich aber melden.
    vielen dank schonmal !!!

    so sieht es im mom aus. jetzt ist es zusätzlich auch noch so das sobald spieler 2 einmal eine schnellere runde gefahren ist, er auch runden anzeigt die eigentlich länger waren

    VB.NET-Quellcode

    1. Private Sub txtIn3_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtIn3.TextChanged
    2. If txtIn.Text > txtIn1.Text Then
    3. txtIn3.Text = txtIn.Text
    4. Else
    5. txtIn3.Text = txtIn1.Text
    6. End If
    7. End Sub
    Ok verstehe , ja das er nur das anzeigt, wenn du in textbox3 was eingbist hat glaube ich damit zu tun, dass du das in dem textchange event von der dritten textbox geschrieben hast. Melde dich falls du weitere hilfe benötigst bzw. wenn du auch einen Ansatz hast.
    ich komme einfach nicht weiter. kann mir jemand sagen wo der code stehen muss ?
    er sollte immer die insegesamt schnellste runde anzeigen, und natürlich auch von wem sie gefahren wurde.

    als extra wäre es schön wenn die schnellste runde des jeweiligen spieler angezeigt würde.

    Einen guten rutsch und danke für eure hilfe.
    Gruß Stefan
    Versuch's mal damit:

    VB.NET-Quellcode

    1. ...
    2. ...
    3. Public Class Form1
    4. Private zählen As Integer = 20
    5. Dim WithEvents sp As New SerialPo
    6. Dim BesteRunde As String = ""
    7. Dim BesteRundeFahrer1 As String = ""
    8. Dim BesteRundeFahrer2 As String = ""
    9. ...
    10. ...
    11. Private Sub SerialPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles sp.DataReceived
    12. Dim str As String
    13. str = sp.ReadLine()
    14. Dim tmp As String = ""
    15. Static Beste As Double = 99
    16. Static Beste1 As Double = 99
    17. Static Beste2 As Double = 99
    18. tmp = str.Substring(str.IndexOf("Rundenzeit") + 12, 5)
    19. tmp = tmp.Replace(":"c, ","c)
    20. If str.StartsWith("Spieler 1") Then
    21. Beste1 = Math.Min(Beste1, CDbl(tmp))
    22. Invoke(myDelegate, str)
    23. Else
    24. Beste2 = Math.Min(Beste2, CDbl(tmp))
    25. Invoke(myDelegate2, str)
    26. End If
    27. Beste = Math.Min(Beste1, Beste2)
    28. BesteRunde = Beste.ToString
    29. BesteRundeFahrer1 = Beste1.ToString
    30. BesteRundeFahrer2 = Beste2.ToString
    31. End Sub
    Also zunächst mal Frohes neues Jahr !
    Ich habe deinen code genommen und diesen eingefügt, das programm läuft auch ohne fehler durch.
    Wie kann ich mir das ganze nun in die textboxen schreiben ? wenn ich mit invoke arbeite sagt er mir immer das double nicht in string konvertiert werden kann.

    und wenn ich die 20 runden gefahren bin sagt er "Ungültige Konvertierung von der Zeichenfolge AT GE in Typ Double."
    bei

    VB.NET-Quellcode

    1. Beste2 = Math.Min(Beste2, CDbl(tmp))


    auch wenn ich bei mydelegate3 as Double eingeben. Warscheinlich ist es nur ein kleiner codeschnippsel der fehlt.

    Vielen dank schonmal für deine Hilfe !

    Grüße Stefan