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.
