vb.net 2010, SerialPort1 öffnen?

Gast #2166160
Lesenswert?

Hallo zusammen,

eine externe Hardware wird über einen virtuellen ComPort(USB) an den PC 
angeschlossen. Beim Laden der Form wird der SerialPort1 initialisiert 
und geöffnet(ist wirklich offen, laut Debugger). Es werden keine Daten 
empfangen sondern nur nach Mausclick auf diverse Button sollen 2-3 Byte 
gesendet werden.
Und hier ist das Problem: Nach Click kommt im Debugger die 
Fehlermeldung:
'Der Anschluss ist geschlossen'

Wenn ich jedoch die Buttonkommandos in .Open() und .Close() einrahme, 
funktioniert das Ganze.

Hier der Codeausschnitt:

Imports System.IO.Ports
Public Class frmHome

Private Sub frmHome_Load(ByVal sender As System.Object, ByVal e As _ 
System.EventArgs) Handles MyBase.Load

SerialPort1.PortName = "COM9"
Serialport1.BaudRate = 9600
Serialport1.DataBits = 8
Serialport1.StopBits = IO.Ports.StopBits.One
Serialport1.Parity = IO.Ports.Parity.None
Serialport1.Handshake = IO.Ports.Handshake.None
Serialport1.Open()
.
.
.
.
End Sub
'Solange das Program sich im frmHome_Load befindet ist der Port 
geöffnet.


Private Sub Button1_Click(ByVal sender As System.Object, ByVal _
e As System.EventArgs) Handles Button.Click
        'SerialPort1.Open()
        Dim Buffer() As Byte = {&H1B, &H4D, &H41}
        SerialPort1.Write(Buffer, 0, 3)
        'SerialPort1.Close()
        'My.Settings.AttenMerker = 1 'Anwendungsspeicherung
        'My.Settings.Save() 'Anwendungsspeicherung
End Sub 'Im Button-Click Event ist der Port heschlossen

End Class


Hat jemand eine Erklärung für diess Verhalten?
Besten Dank für eure Hilfe!
Gast #2166610
Lesenswert?

Danke für euren Beiträge!

Ja, ich nutze VS2010-Express.

Ich habe mittlerweile zwei Varianten ausprobiert:
Die erste Variante mit der Komponente SerialPort1 aus der Toolbox. Hier 
lassen sich ja die Einstellungen leicht vorbehmen, wie Sebastian H. 
schreibt.

Die zweite Variante mit einer Instance der SerialPort.

Beide Varianten funktionieren nur, wenn ich in der Button1-SUB vor dem 
Senden den Port öffne.

Alle Beispiele die ich im Netz finde sagen mir, dass es ohne dieses 
explizite Öffnen gehen muss.

Hier mal ein Code der meinem sehr nahe kommt. Da funktioniert laut den 
Usern alles Besten:
http://www.vb-magazin.de/forums/forums/p/4118/15752.aspx
Gast #2166623
Lesenswert?

Sebastian H. schrieb:
> Allerdings lese ich auch direkt danach wieder vom Port, was ist wenn Du
> das mal probierst?

Hm, also lesen tue ich bis jetzt noch garnicht.
Die Leseroutinen hab ich noch nicht geschrieben. Da müssen 
CRLF-terminierte kurze Datensätze von einem Multimeter gelesen werden. 
Aber das wird noch..
Gast #2166632
Lesenswert?

Leute, es ist verrückt wie immer: Das Problem sitzt vorm Monitor!

Auf meiner Form sitzen einige Radiobutton. Einer davon beinhaltet die 
Anweisung 'SerialPort1.Close()'.

Nachdem die Form geladen und der Port geöffnet wurde, wurde im Verlaufe 
der weiteren Initialisierung obiger Radiobutton durch die Abhängikeit 
von anderen Radiobuttons initialisiert und der Port wieder geschlossen.

Eigentlich schade das ich eure Zeit beansprucht habe, andererseits ist 
es aber auch so, dass diese Unterhaltung meinen Kopf mal aufgeräumt hat 
und das Problem von Jetzt auf Sofort vor Augen hatte ;)

Daher: Vielen Dank für eure Zeit!
#2167064
Lesenswert?

Hehe, ja so gehts manchmal. Alle vorhandenen Com-Ports kann man sich 
übrigens über folgende Funktion anzeigen lassen. Ich nutze zwei 
Comboboxen dafür...

Gruß, Sebastian


Private Sub Ports_testen()
        Dim Comport As String
        ComboBox_Ports1.Items.Clear()
        ComboBox_ports2.Items.Clear()
        Comport = "Kein Port"
        For Portzaehler = 1 To 16
            If PortTest(Portzaehler) = True Then
                ComboBox_Ports1.Items.Insert(Portzaehler - 1, "COM" & 
Portzaehler)
                ComboBox_ports2.Items.Insert(Portzaehler - 1, "COM" & 
Portzaehler)
                Comport = "COM" & Portzaehler
            End If
        Next
    End Sub

    Private Function PortTest(ByVal COMPortNummer As Integer) As Boolean
        SerialPort1.PortName = "COM" & COMPortNummer
        Try
            SerialPort1.Open()
            SerialPort1.Close()
            PortTest = True
        Catch X As Exception
            PortTest = False
        End Try
    End Function
Persönliche Seite #2167071
Lesenswert?

PortTest liefert nur dann True, wenn die Schnittstelle existiert und 
nicht von was anderem belegt ist, obendrein "fasst" es die Schnittstelle 
kurzzeitig an, was daran angeschlossene Hardware durcheinanderbringen 
kann (Wackeln an Handshakeleitungen).

Besser ist es, in der Registry zu forschen, das ist allerdings auch 
aufwendiger.

Was lässt Dich annehmen, daß Schnittstellennummern > 16 nicht auftreten?
#2167445
Lesenswert?

In der Tat, so funktioniert es viel besser. Von mehr Aufwand kann 
allerdings nicht die Rede sein und es werden bis zu 100 (!!) Com-ports 
unterstützt :-)

Super gut!

Private Sub Ports_testen()
        Dim ports As String() = 
System.IO.Ports.SerialPort.GetPortNames()
        For i = 0 To 100
            Try
                ComboBox_Com1.Items.Insert(i, ports(i))
            Catch ex As Exception
                Exit For
            End Try
        Next
End Sub
#2167482
Lesenswert?

Sebastian H. schrieb:
> In der Tat, so funktioniert es viel besser. Von mehr Aufwand kann
> allerdings nicht die Rede sein und es werden bis zu 100 (!!) Com-ports
> unterstützt :-)

So viele wie das OS/der Treiber/die Komponente unterstützt, die 100 
resultieren nur aus dem gezeigten Quelltext...
1
    // also entweder 
2
    For i = 0 To ports.Length - 1
3
    // oder
4
    For Each s in ports
5
    // oder ganz einfach
6
    comboBox.Items.AddRange(SerialPort.GetPortNames())

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren