COM finder

  • VB.NET

Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von TRiViUM.

    Die Empfang Funkion wird hier aufgerufen:

    VB.NET-Quellcode

    1. Private Sub SerialPort1_DataReceived(sender As System.Object, e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    2. ReceivedText(SerialPort1.ReadExisting())
    3. End Sub





    VB.NET-Quellcode

    1. Imports System
    2. Imports System.Threading
    3. Imports System.IO.Ports
    4. Imports System.ComponentModel
    5. Public Class Form1
    6. '------------------------------------------------
    7. Dim myPort As Array
    8. Delegate Sub SetTextCallback(ByVal [text] As String) 'Added to prevent threading errors during receiveing of data
    9. '------------------------------------------------
    10. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    11. ComboBox2.Text = "9600"
    12. myPort = IO.Ports.SerialPort.GetPortNames()
    13. ComboBox1.Items.AddRange(myPort)
    14. Button2.Enabled = False
    15. Button4.Enabled = False
    16. Dim params() As String = Environment.GetCommandLineArgs
    17. For Each parameter As String In params
    18. If parameter = "com" Then
    19. Try
    20. SerialPort1.Close()
    21. SerialPort1.PortName = parameter
    22. SerialPort1.BaudRate = 9600
    23. SerialPort1.Open()
    24. Button1.Enabled = False
    25. Button2.Enabled = True
    26. Button4.Enabled = True
    27. MsgBox(parameter)
    28. Catch ex As Exception
    29. End Try
    30. End If
    31. Next
    32. End Sub
    33. '------------------------------------------------
    34. Private Sub ComboBox1_Click(sender As System.Object, e As System.EventArgs) Handles ComboBox1.Click
    35. End Sub
    36. '------------------------------------------------
    37. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    38. Try
    39. SerialPort1.Close()
    40. SerialPort1.PortName = ComboBox1.Text
    41. SerialPort1.BaudRate = ComboBox2.Text
    42. SerialPort1.Open()
    43. Button1.Enabled = False
    44. Button2.Enabled = True
    45. Button4.Enabled = True
    46. Catch ex As Exception
    47. End Try
    48. End Sub
    49. '------------------------------------------------
    50. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    51. SerialPort1.Write(RichTextBox1.Text & vbCr)
    52. End Sub
    53. Private Sub Button4_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click
    54. SerialPort1.Close()
    55. Button1.Enabled = True
    56. Button2.Enabled = False
    57. Button4.Enabled = False
    58. End Sub
    59. Private Sub SerialPort1_DataReceived(sender As System.Object, e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    60. ReceivedText(SerialPort1.ReadExisting())
    61. End Sub
    62. Private Sub ReceivedText(ByVal [text] As String) 'input from ReadExisting
    63. If Me.RichTextBox2.InvokeRequired Then
    64. Dim x As New SetTextCallback(AddressOf ReceivedText)
    65. Me.Invoke(x, New Object() {(text)})
    66. Else
    67. Me.RichTextBox2.AppendText([text]) 'append text
    68. 'RichTextBox2.SelectionStart = Len(RichTextBox2.Text)
    69. 'RichTextBox2.ScrollToCaret()
    70. End If
    71. End Sub
    72. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    73. 'ComboBox1 mit verfügbaren seriellen Schnittstellen füllen
    74. myPort = IO.Ports.SerialPort.GetPortNames()
    75. ComboBox1.Items.Clear()
    76. ComboBox1.Items.AddRange(myPort)
    77. SerialPort1.WriteTimeout = 1000
    78. SerialPort1.BaudRate = "9600"
    79. SerialPort1.Close()
    80. Button1.Enabled = False
    81. Button2.Enabled = True
    82. Button4.Enabled = True
    83. For Each Port In IO.Ports.SerialPort.GetPortNames()
    84. Try
    85. MsgBox(Port)
    86. SerialPort1.PortName = Port
    87. SerialPort1.Open()
    88. SerialPort1.Write(Port)
    89. SerialPort1.Close()
    90. Catch ex As Exception
    91. End Try
    92. Next
    93. End Sub
    94. Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
    95. End Sub
    96. Private Sub PictureBox1_Click(sender As Object, e As EventArgs)
    97. End Sub
    98. Private Sub TabControl1_Click(sender As Object, e As EventArgs) Handles TabControl1.Click
    99. RichTextBox2.Clear()
    100. End Sub
    101. Private Sub Label1_Click(sender As Object, e As EventArgs)
    102. End Sub
    103. Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
    104. Dim Interval3 As String
    105. Interval3 = TextBox3.Text
    106. Dim Interval4 As String
    107. Interval4 = TextBox4.Text
    108. myPort = IO.Ports.SerialPort.GetPortNames()
    109. ComboBox1.Items.Clear()
    110. ComboBox1.Items.AddRange(myPort)
    111. RichTextBox2.Clear()
    112. SerialPort1.Close()
    113. SerialPort1.BaudRate = 9600
    114. For i = CInt(Interval3) To CInt(Interval4) Step 1
    115. Dim portnummer As String
    116. portnummer = CStr(i)
    117. If ComboBox1.Items.Contains("COM" + portnummer) Then
    118. Try
    119. SerialPort1.Close()
    120. SerialPort1.PortName = "COM" + portnummer
    121. SerialPort1.Open()
    122. Dim ident As String
    123. ident = TextBox5.Text
    124. RichTextBox2.AppendText("COM" + portnummer + vbCr)
    125. RichTextBox2.AppendText("---------------------" + vbCr)
    126. SerialPort1.Write(ident + vbCr) 'concatenate with \
    127. Catch ex As Exception
    128. End Try
    129. End If
    130. Next i
    131. End Sub
    132. Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click
    133. Process.Start("hdwwiz.cpl")
    134. End Sub
    135. Private Sub RichTextBox2_TextChanged(sender As Object, e As EventArgs) Handles RichTextBox2.TextChanged
    136. End Sub
    137. Private Sub Label2_Click(sender As Object, e As EventArgs) Handles Label2.Click
    138. End Sub
    139. End Class


    Ich habe jetzt noch schnell folgendes ausprobiert mit Thread.sleep(1000):

    VB.NET-Quellcode

    1. 'ComboBox1 mit verfügbaren seriellen Schnittstellen füllen
    2. myPort = IO.Ports.SerialPort.GetPortNames()
    3. ComboBox1.Items.Clear()
    4. ComboBox1.Items.AddRange(myPort)
    5. SerialPort1.WriteTimeout = 1000
    6. SerialPort1.BaudRate = "9600"
    7. SerialPort1.Close()
    8. Button1.Enabled = False
    9. Button2.Enabled = True
    10. Button4.Enabled = True
    11. For Each Port In IO.Ports.SerialPort.GetPortNames()
    12. Try
    13. MsgBox(Port)
    14. SerialPort1.PortName = Port
    15. SerialPort1.Open()
    16. SerialPort1.Write(Port)
    17. Thread.Sleep(1000)
    18. SerialPort1.Close()
    19. Catch ex As Exception
    20. End Try
    21. Next


    Leider auch ohne erfolg :(
    @franky89 Ich hatte da noch eine Frage:

    RodFromGermany schrieb:

    Wie soll es denn funktionieren?
    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!
    Ich möchte auf meinen Button drücken:
    An alle verfügbaren seriellen Schnittstellen soll nacheinander der Name der Seriellen Schnittstelle gesendet werden.
    Beispiel: An COM1 wird COM1 gesendet
    Da eine Brücke in einer der Seriellen Anschlüsse zwischen Rx und Tx gesteckt wird zeigt mir das Programm die Schnittstelle an an der die Brücke gesteckt ist.

    Zweck des Programmes ist das man mithilfe des Kurzschlusssteckers (Rx Tx) angezeitgt bekommt welcher COM Port zu welchen Kabel/Buchse gehört.

    Popa21 schrieb:

    Mach mal das Try weg
    Dort wird das TimeOut gefangen.
    @franky89 Wo befindet sich die Gegenstelle?
    Soll das Port selbst die Gegenstelle sein? Das geht nicht, weil ein SerialPort kann nur eines gleichzeitig, senden XOR empfangen.
    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!
    Ja der Port soll über die Brücke an Rx Tx selbst die Gegenstelle sein.
    Ich vermute das ist auch das Problem... :(
    Allerdings Funktioniert das ganze im Terminal Modus in dem ich nur einmal an einen Port die Nachricht sende :|
    Hättest du eine Idee wie man das anders realisieren könnte?

    franky89 schrieb:

    Terminal Modus
    Ich weiß nicht, was der macht.
    Allerdings könntest Du die Steuerleitungen verwenden und gezielt setzen und abfragen. Such mal gezielt danach, das gab es auch schon hier im Forum.
    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:

    Soll das Port selbst die Gegenstelle sein? Das geht nicht, weil ein SerialPort kann nur eines gleichzeitig, senden XOR empfangen.
    Dass der Port selbst nicht auch die Gegenstelle sein kann, sehe ich anders. Die Tx-Rx-Brücke würde dann die Gegenstelle darstellen.
    Eigentlich ist es doch egal, ob die Daten von einer Gegenstelle auf die RX-Leitung kommen, oder sie durch eine Tx-Rx-Brücke wieder zurück empfangen werden, oder nicht :?:

    Demnach müsste doch die Logik folgende sein:
    > Durch jeden COM-Port iterieren
    > Port Öffnen
    > Portname senden
    > Empfangspuffer auslesen und Prüfen, ob der gesendete Port-Name durch die Tx-Rx-Brücke zurück empfangen wurde (ReadExisting)
    > Falls ja, Break
    > Falls nein, Port schließen und weiter iterieren

    Nicht getestet:

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.Windows.Forms
    3. Imports System.IO.Ports
    4. Namespace WindowsFormsApplication1
    5. Public Partial Class Form1
    6. Inherits Form
    7. Public Sub New()
    8. InitializeComponent()
    9. End Sub
    10. Private SerialPort1 As SerialPort = New SerialPort()
    11. Private Function GetBridgedComPort() As String
    12. Dim result As String = ""
    13. For Each port As String In SerialPort.GetPortNames()
    14. SerialPort1.PortName = port
    15. SerialPort1.Open()
    16. SerialPort1.Write(port)
    17. 'System.Threading.Thread.Sleep(10) 'Hier ggf. ne kleine Wartezeit einfügen
    18. result = SerialPort1.ReadExisting()
    19. SerialPort1.Close()
    20. If result = port Then
    21. Exit For
    22. Else
    23. result = ""
    24. End If
    25. Next
    26. Return result
    27. End Function
    28. End Class
    29. End Namespace


    Wenn die Funktion einen Port mit einer Tx-Rx-Brücke gefunden hat, dann gibt sie den Portnamen zurück, andernfalls ist der Rückgabewert ein Leerstring (so zumindest die Theorie :D )

    Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von „TRiViUM“ ()