COM finder

  • VB.NET

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

    Hallo Zusammen,
    ich versuche ein Programm zu programmieren das an alle vorhandenen Ports ein Signal schickt. An COM1 wird COM1 gesendet an COM2 wird COM2 gesendet usw...
    Durch einen Kurzschlussstecker bekomme ich dann den Port angezeigt an dem der Kurzschlussstecker steckt.

    In dem Programm habe ich ein kleines Terminal Programm programmiert...
    Das funktioniert ohne Probleme :)

    Leider funktioniert die Funktion an alle verfügbaren Schnittstellen signal schicken und anzeigen an welchen Port der Kurzschlussstecker steckt nicht... :(
    Ich lande immer bei kein Kurzschlussstecker gesteckt :(
    Oder bekomme andere schwierigkeiten COM1 funktioniert aber nach dem umstecken an COM2 funktioniert das Programm nicht mehr. (Kein Stecker gesteckt)

    Habt ihr eine Idee wie man das eleganter lösen könnte?
    Danke schon mal :)


    VB.NET-Quellcode

    1. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click // Button für den COM Test
    2. 'Interval Zahlen für Schleife einlesen
    3. Dim Interval1 As String
    4. Interval1 = TextBox1.Text
    5. Dim Interval2 As String
    6. Interval2 = TextBox2.Text
    7. 'ComboBox1 mit verfügbaren seriellen Schnittstellen füllen
    8. myPort = IO.Ports.SerialPort.GetPortNames()
    9. ComboBox1.Items.Clear()
    10. ComboBox1.Items.AddRange(myPort)
    11. 'Text Box für die Anzeige der empfangenen Daten leeren, Schnittstelle schließen und Baut Rate einstellen
    12. RichTextBox2.Clear()
    13. SerialPort1.Close()
    14. SerialPort1.BaudRate = 9600
    15. 'Schleife z.B 1-35 Alle Schnittstellen von COM1 bis COM35
    16. For i = CInt(Interval1) To CInt(Interval2) Step 1
    17. Dim portnummer As String
    18. portnummer = CStr(i)
    19. If ComboBox1.Items.Contains("COM" + portnummer) Then
    20. 'Wenn i Teil der verfügbaren COM Schnittstellen ist...
    21. Try
    22. SerialPort1.Close()
    23. 'Port öffnen
    24. SerialPort1.PortName = "COM" + portnummer
    25. SerialPort1.Open()
    26. SerialPort1.Write("COM" + portnummer + vbCr)
    27. 'Die geschriebene Portnummer wird über den Kurzschlussstecker wieder empfangen...
    28. Catch ex As Exception
    29. End Try
    30. If RichTextBox2.Text = "" Then 'Wenn kein Wert empfangen wurde Meldung...
    31. RichTextBox2.Text = "Kein Teststecker gefunden!!!"
    32. End If
    33. SerialPort1.Close()
    34. 'Port wieder schließen
    35. End If
    36. Next i
    37. End Sub


    /// Zum Empfangen...

    VB.NET-Quellcode

    1. Private Sub ReceivedText(ByVal [text] As String) 'input from ReadExisting
    2. If Me.RichTextBox2.InvokeRequired Then
    3. Dim x As New SetTextCallback(AddressOf ReceivedText)
    4. Me.Invoke(x, New Object() {(text)})
    5. Else
    6. Me.RichTextBox2.AppendText([text]) 'append text
    7. 'RichTextBox2.SelectionStart = Len(RichTextBox2.Text)
    8. 'RichTextBox2.ScrollToCaret()
    9. End If
    10. End Sub
    mpfangen

    ~blaze~: vbnet-Tags eingefügt

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

    @franky89 Zieh mal aus Deinem völlig unverständlichen Code die wenigen erforderlichen Zeilen Code raus, mit denen Du das anzusprechende Port auswählst.
    Was soll das:
    COM1 bis COM35
    :?:
    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!
    Hi RodFromGermany,
    ich wusst leider nicht wie ich das besser lösen kann :(
    deswegen bin ich ja hier...

    Ich benutzte eine For schleife die 1-35 durchläuft und vergleiche dann ob die i in der Combobox (in der die verfügbaren Schnittstellen stehen) vor kommt...

    Hast du eine Idee wie man das besser lösen kann?
    Danke
    @franky89 Wenn in derf ComboBox die Namen der verffügbaren COM-Ports stehen, dann ist ComboBox1.SelectedItem der Name des gewählten Ports.
    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!
    @RodFromGermanynulldanke
    aber mein Problem ist das ich an alle Ports die in der ComboBox stehen den Text des Items über die serielle schnittstelle schicken möchte. Über den Kurzschlussstecker müsste mir dann ja ausgegeben werden an welchen port der stecker steckt...

    franky89 schrieb:

    @RodFromGermanynulldanke

    Ist das n Eingabefehler oder ein Statement?
    Egal.

    Funktioniert denn Dein Sendecode überhaupt? Hast Du ihn schon anderweitig validiert? Kommt denn, wenn Du eine spezielle COM-Schnittstelle ansprichst, überhaupt was an?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed das Statement ignoriere ich zunächst mal. ;)

    franky89 schrieb:

    an alle Ports
    Dann machst Du

    VB.NET-Quellcode

    1. For Each port In IO.Ports.SerialPort.GetPortNames()
    2. port.Name = port
    3. ' ...
    4. Next
    und feddich
    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!

    VB.NET-Quellcode

    1. For Each port In IO.Ports.SerialPort.GetPortNames()
    2. port.name = port
    3. '
    4. SerialPort1.Open()
    5. SerialPort1.PortName = "COM" + ????
    6. SerialPort1.Close()
    7. Next


    Klingt schon gut nur versteh ichs leider noch nicht ganz :/
    Ich möchte an jeden Port ja den namen des Ports schicken...
    Wie bekomm ich den namen her?
    In meinem ersten Versuch wurde ja dieser über die Schleife generiert :(

    z.B verfügbare Ports
    COM1
    COM2
    COM3

    Das Programm sendet an COM1 "COM1" an COM2 "COM2" an COM3 "COM3"
    Da nur an einer Schnittstelle der Kurzschlusstecker ist kommt z.B COM2 zurück
    So ist zumindest der Plan :D

    Möchte mich schon mal für deine Unterstützung bedanken ;)

    franky89 schrieb:

    Wie bekomm ich den namen her?
    Sieh Dir mal die Schleifenvariable an:

    VB.NET-Quellcode

    1. For Each port In IO.Ports.SerialPort.GetPortNames()
    2. MessageBox.Show(port)
    3. ' ...
    4. End If
    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!
    Hallo,
    End If
    [/quote]
    Leider verstehe ich noch nicht wie ich das umsetzen kann :(

    myPort = IO.Ports.SerialPort.GetPortNames()
    ComboBox1.Items.Clear()
    ComboBox1.Items.AddRange(myPort)
    For Each myPort In IO.Ports.SerialPort.GetPortNames()
    MessageBox.Show(myPort)
    ' ...
    Next

    Das unterstrichene wird rot unterringelt ?(
    Außerdem versteh ich nicht wie ich damit zu dem gewünschten Ergebnis komme
    Trotzdem Danke

    Bin über jede weitere Hilfe Dankbar

    Gruß Frank
    @franky89 Fang an mit Option Strict On.
    Du verwendest einmal die Variable myPort als String-Array,
    zum anderen versuchst Du, die Variable myPort als String zu verwenden.
    Klar, dass das nicht funktioniert.
    Versuche selbst, das ohne explizite Hilfe zu beheben. :thumbup:
    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,
    ich vermute so könnte es funktionieren :)
    myPort = IO.Ports.SerialPort.GetPortNames()
    ComboBox1.Items.Clear()
    ComboBox1.Items.AddRange(myPort)
    For Each Port In IO.Ports.SerialPort.GetPortNames()
    MessageBox.Show(Port)
    ' ...
    SerialPort1.PortName = Port
    SerialPort1.Open()

    SerialPort1.Write(Port)
    SerialPort1.Close()

    Next

    bin leider erst morgen wieder an einem rechner mit mehreren Schnittstellen zum testen

    franky89 schrieb:

    so könnte es funktionieren
    Jou. :thumbup:
    Allerdings musst Du die PortNames nur ein Mal auslsen, und gib der Variable gleich einen besseren Namen:

    VB.NET-Quellcode

    1. myPorts = IO.Ports.SerialPort.GetPortNames() ' myPorts
    2. ComboBox1.Items.Clear()
    3. ComboBox1.Items.AddRange(myPorts)
    4. For Each Port In myPorts
    5. MessageBox.Show(Port)
    6. ' ...
    7. SerialPort1.PortName = Port
    8. SerialPort1.Open()
    9. SerialPort1.Write(Port)
    10. SerialPort1.Close()
    11. Next
    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!

    franky89 schrieb:

    mit der try catch Anweisung
    findest Du keinen Fehler.
    Was genau ist passiert?
    Dem Port kannst Du einen Sende- und einen Empfangstimeout geben.
    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 1 mal editiert, zuletzt von „RodFromGermany“ ()

    Das Fenster ist eingefroren :(
    In dem Programm habe ich auch ein Terminal realisiert das funktioniert immer ohne Probleme...
    Wie kann ich das Sende Timeout realisieren?

    Ok hab was gefunden
    SerialPort1.WriteTimeout = 1000

    Werde das morgen nochmal ausprobieren ;)

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

    franky89 schrieb:

    eingefroren
    Wo steht die Abarbeitung, wenn Du Break machst?
    Stimmen die anderen Port-Properties?
    Ist die Gegenstelle angeschlossen?
    Ist ja klar, dass, wenn Du das richtige Port suchst, er nur da was findet. Bei den anderen Ports muss er auf das Timeout warten.
    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!
    Die Port-Properties stimmen da über das Terminal (im gleichen Programm) auch alles funktioniert :)
    Gegenstelle ist ja eine Tx Rx Brücke die auch über das Terminal funktioniert... Also kann ich auch ausschließen
    Leider bekomme ich immer noch keine Antwort von meiner Seriellen Schnittstelle wenn ich wie oben vorgehe.

    Eventuell liegt das mit an dem Empfangsteil des Programmes??? Das aber im Terminal Modus ohne weiteres super Funktioniert...

    Private Sub ReceivedText(ByVal [text] As String) 'input from ReadExisting
    If Me.RichTextBox2.InvokeRequired Then
    Dim x As New SetTextCallback(AddressOf ReceivedText)
    Me.Invoke(x, New Object() {(text)})
    Else

    Me.RichTextBox2.AppendText([text]) 'append text
    'RichTextBox2.SelectionStart = Len(RichTextBox2.Text)
    'RichTextBox2.ScrollToCaret()
    End If
    End Sub

    Terminal teil:
    SerialPort1.Write(RichTextBox1.Text & vbCr)
    Außerdem gibt es noch zwei Buttons zum öffnen und schließen des Portes

    Programmteil der nicht Funktioniert:

    VB.NET-Quellcode

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



    Hat jemand noch eine Idee warum es nicht Funktioniert???
    :/

    Sinnloses Vollzitat entfernt. Editiert. ~fufu

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

    franky89 schrieb:

    warum es nicht Funktioniert?
    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!
    Poste doch mal den gesamten Code, den irgendwo muss ja die 'Empfang-Funktion' aufgerufen werden.

    Mein Tipp: Du führst das ganze mit den Senden in einen eigenen Thread aus und du lässt dein Programm vor

    Quellcode

    1. SerialPort1.Close()
    etwas warten(50-100 ms). Dann schaust du dir die Events von SerialPort an, irgendwo gibt's wohl ein DateRecived Event oder so. Deinen Text kannst du dir dann aus der e Variable holen.

    LG Popa21
    Bei den Maßen der Einfachheit stößt man an Grenzen, aber: "Es geht immer komplizierter".