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!
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.
Hast du den SerialPort initialisiert? Ich würde deine ganzen Zuweisungen einfach in die new Serialport()-Klammern reinnehmen. Mit freundlichen Grüßen, Valentin Buck
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?
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
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
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.
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..
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!
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
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?
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...
Ach so ja, in meinem Programm kann ich Ports_testen() natürlich nur ausführen wenn Serialport1 und 2 NICHT geöffnet sind....
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
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
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()) |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.