Forum: PC-Programmierung vb.net 2010, SerialPort1 öffnen?


von Portswächter (Gast)


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!

von Peter II (Gast)


Lesenswert?

wo kommt denn die Variable SerialPort1 her?

von Portswächter (Gast)


Lesenswert?

Peter II schrieb:
> wo kommt denn die Variable SerialPort1 her?

Das ist der Name der Komponente aus der Toolbox, die von mir in den 
Formdesigner geladen wurde.

von Sebastian H. (sebastian112)


Lesenswert?

Welche Entwicklungsumgebung nutzt du?

von Valentin B. (nitnelav) Benutzerseite


Lesenswert?

Hast du den SerialPort initialisiert?
Ich würde deine ganzen Zuweisungen einfach in die new 
Serialport()-Klammern reinnehmen.

Mit freundlichen Grüßen,
Valentin Buck

von Sebastian H. (sebastian112)


Angehängte Dateien:

Lesenswert?

Also falls Du Visual Studio nutzt müssen deine Einstellungen nicht extra 
geladen werden. Bei mir sehen die Einstellungen so aus und es läuft 
prima...

Allerdings lese ich auch direkt danach wieder vom Port, was ist wenn Du 
das mal probierst?

von Valentin B. (nitnelav) Benutzerseite


Lesenswert?

Bist du dir auch ganz sicher, dass ein COM9 existiert?
Ich mache das lieber mit einer Combobox, in der ich alle verfügbaren 
Ports anzeigen lasse und dann den richtigen einstellen kann.

Mit freundlichen Grüßen,
Valentin Buck

von Portswächter (Gast)


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

von Portswächter (Gast)


Lesenswert?

Valentin Buck schrieb:
> Bist du dir auch ganz sicher, dass ein COM9 existiert?

Ja, absolut!

Denn wenn ich dieses mache:

SerialPort1.Open()
Dim Buffer() As Byte = {&H1B, &H4D, &H41}
SerialPort1.Write(Buffer, 0, 3)
SerialPort1.Close()

kann ich meine externe Hardware klappern(Relais) lassen.

von Portswächter (Gast)


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..

von Portswächter (Gast)


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!

von Sebastian H. (sebastian112)


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

von Rufus Τ. F. (rufus) Benutzerseite


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?

von Sebastian H. (sebastian112)


Lesenswert?

Hallo Rufus,

in dem Fall wäre es gut von dir, den Code für das Erforschen der 
Registry mitzuliefern.... die Aussage "aufwendiger" kann viel 
bedeuten...

Du hast natürlich Recht, bei manch einem treten auch viel größere 
Portnummern auf. Die 16 war nur in meinem Fall ganz gut...

von Sebastian H. (sebastian112)


Lesenswert?

Ach so ja, in meinem Programm kann ich Ports_testen() natürlich nur 
ausführen wenn Serialport1 und 2 NICHT geöffnet sind....

von Peter II (Gast)


Lesenswert?

scheinbar bietet .net schon alles dafür an - selber aber noch nicht 
getestet

http://msdn.microsoft.com/de-de/library/system.io.ports.serialport.getportnames.aspx

von Sebastian H. (sebastian112)


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

von Arc N. (arc)


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())

von Sebastian H. (sebastian112)


Lesenswert?

Ach, die 100 waren doch bloß Ironie :-)

Aber deine Möglichkeit ist noch besser, dann kann man sich die 
try-Anwendung sparen.

    Private Sub Ports_testen()
        Dim ports As String() = 
System.IO.Ports.SerialPort.GetPortNames()
        For i = 0 To ports.Length - 1
            ComboBox_Com1.Items.Insert(i, ports(i))
        Next
    End Sub

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.