Com automatisch wählen

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Mad Andy.

    Com automatisch wählen

    Hallo,
    vermutlich vorerst meine letzte Hürde die es zu lösen gilt.
    -Der PC besitzt meist mehrere COMs
    -Das Modul was an einen Port angeschlossen ist sendet mir ein "OK" zurück, wenn ich eine bestimmte Zeichenfolge sende.
    Der nötige Com-Port soll also automatisch ermittelt werden.
    Zum test hatte ich ein kleines Programm geschrieben, aber es scheitert schon darann, das ich an COM1 und COM3 Daten senden kann und bei COM2 bekomme ich einen Fehler (COm1-3 vorhanden, Modul an COM3)

    Gedanke: ein bereits geöffneter COM darf nicht abgefragt werden um nicht andere Module an den COMs zu beeinflussen. Wäre das Richtig so?
    Wie teste ich ob ein Port bereits offen ist?

    Das habe ich schon mal als Gerüst zusammengestellt.
    (Für das Forum abgeändert, da sonnst zu lang)
    Habe gerade einen bösen fehler entdekt Z gibt hier die Anzahl der Ports an, nicht aber die eigentliche Nummer. Gehen wir also mal davon aus, das es nur COM1-3 gibt



    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim COM_Schnittstellen As String()
    3. Dim A As Integer ' Anzahl der gefundenen Ports
    4. Dim Port As String 'Port der gerade geählt ist
    5. DIM Z AS integer
    6. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    7. COM_Schnittstellen = System.IO.Ports.SerialPort.GetPortNames() ' COMs ermitteln
    8. A = COM_Schnittstellen.Length 'Anzahl der Schnittstellen
    9. IF A = 0 then MSGBOX ("kein COM gefunden") : --->ENDE
    10. For Z = 1 to A 'alle Ports abfragen
    11. IF ????Port schon geöffnet???? then Next : ---> Nichts gefunden
    12. Dim com As IO.Ports.SerialPort = My.Computer.Ports.OpenSerialPort("COM"&Z) : '?????ist das so erlaubt?
    13. COM.writeline ("Hallo") 'Daten senden
    14. ???? Antwort mit ????? "OK" then --> Z ist das was ich suche...weiter im programm
    15. Close.COM ' Port schließen
    16. Next z
    17. End Sub
    18. Sub SendSerialData(ByVal data As String)
    19. Using com As IO.Ports.SerialPort = My.Computer.Ports.OpenSerialPort("com"&Z)
    20. com.WriteLine(data)
    21. End Using
    22. End Sub
    23. End Sub



    Ist die Reihenfolge prinzipiell Falsch?
    Da wo die Fragezeichen sind komm ich eben nicht weiter.
    ---> Hier geht es halt anders weiter

    Danke für jede Hilfe

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

    Ich habe es eben mal schnell unter VB6 probiert:

    VB.NET-Quellcode

    1. Private Function chkport(ByVal Portnr As Integer) As Boolean
    2. On Error GoTo Fehler
    3. chkport = False
    4. MSComm1.CommPort = Portnr
    5. MSComm1.PortOpen = True
    6. chkport = True
    7. MSComm1.PortOpen = False
    8. Fehler:
    9. On Error GoTo 0
    10. End Function
    Gruß
    Peterfido

    Keine Unterstützung per PN!

    Com automatisch wählen

    Habe es nun fast am laufen.
    Hier erst mal der Code

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim COM_Schnittstellen As String()
    3. Dim A As Integer
    4. Dim richtigerport As String
    5. Dim eingang As String
    6. Dim Bits As String
    7. Dim B As Integer
    8. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    9. On Error Resume Next 'Ist leider noch nötig
    10. COM_Schnittstellen = System.IO.Ports.SerialPort.GetPortNames()' Suchen der Ports
    11. 'ComboBox1.Items.AddRange(COM_Schnittstellen)
    12. 'ListBox1.Items.AddRange(COM_Schnittstellen)
    13. A = COM_Schnittstellen.Length 'Anzahl der Com-ports
    14. If A = 0 Then MsgBox("KEINEN seriellen Anschluß gefunden") : Exit Sub
    15. For A = 0 To A - 1
    16. 'If COM_Schnittstellen(A) = "COM3" Then MsgBox("COM3 gefunden") ' war zum testen eingefügt
    17. Dim com As IO.Ports.SerialPort = My.Computer.Ports.OpenSerialPort(COM_Schnittstellen(A))
    18. com.WriteLine("Hallo") ' senden ans Modul
    19. 'eine pause ??? scheint nicht nötig zu sein
    20. eingang = com.ReadByte + com.ReadByte 'ergibt bei einem "OK" = 149 , nicht so schön.....
    21. MsgBox(COM_Schnittstellen(A) & " Antwort : " & eingang) 'Für jeden gefundenen COm eine Box aufmachen
    22. com.Close()
    23. Next
    24. End Sub


    Probleme:
    An COM 3 ist mein Modul, wird auch erkannt
    Auf Com1 und 2 kann ich nicht zugreifen , liegt das eventuell an Win Vista?
    Ich muss die Bytes aus dem Einganspuffer einzeln laden. Readline funktioniert nicht, das Programm steht dann da.
    Die Anzahl der Zeichen im Puffer lassen sich mit BytesToRead nicht abfragen, es ergibt immer 0

    Vielen Dank für jeden Tip

    PS: Hi Peter, Danke erst mal für die Hilfe

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

    VB.NET-Quellcode

    1. If A = 0 Then MsgBox("KEINEN seriellen Anschluß gefunden") : Exit Sub
    sollte eigentlich nicht funzen, weil Exit Sub in jedem Fall aufgerufen wird (das If bezieht sich nur auf die MsgBox) ...
    Entweder

    VB.NET-Quellcode

    1. If A = 0 then : MsgBox("KEINEN seriellen Anschluß gefunden") : Exit Sub : End If
    oder gleich mehrzeillig.

    Über den Rest kann ich nicht wirklich was sagen


    so long..
    Andy
    OH

    mit End IF solltest Du Recht haben.

    Was ich aber gerade sehe.
    Warum funktioniert:

    For a = 0 to a-1

    A wird oberhalb durch die Anzahl der Ports festgelegt.
    Sagen wir mal 3
    a-1 würde am ende nie 2 ergeben, weil a durch die schleife festgelegt wird.