Laden...

SerialPort stürzt ab

Letzter Beitrag vor 5 Monaten 8 Posts 381 Views
SerialPort stürzt ab

Hallo,

ich habe aktuell das Problem, dass mein serialPort nach ein paar Stunden nicht mehr funktioniert.

Die Exception gibt aus dass der Port geschlossen ist. Das erneute öffnen führt zum Fehler dass der Port nicht geöffnet werden kann.

Nach einem Neustart des Programmes läuft wieder alles Reibungslos, der Port wird beim Schließen des Programmes nicht extra geschlossen.

Hat einer eine Idee wieso ?

Mfg

Der SerialPort ist eine Ressource, die von Windows verwaltet wird. Genauer gesagt ist SerialPort nur ein Wrapper für die Windows-Funktionalität.
Wird der Port (bzw. das hinterliegende Handle) nicht korrekt geschlossen, bleibt das Handle als Leiche übrig und der Port ist blockiert. Das passiert mit fast jeder von Windows verwalteten Ressource (Dateien, Ports, Adapter...).

Alle Handles müssen unter Windows immer korrekt geschlossen werden - passiert das nicht, blockiert jeder weitere Zugriff darauf; wie hier.

der Port wird beim Schließen des Programmes nicht extra geschlossen.

Ist also ein grundlegender Fehler.

Hallo,

und Vielen Dank für deine Antwort. Für mich ist allerdings folgendes noch immer unklar, wenn der Port einige Stunden lief ohne Probleme und auf einmal reagiert er nicht mehr auf die gesendeten Daten da der Port angeblich geschlossen ist.

Jedes Mal beim senden fragt er zuvor allerdings ab ob der Port bereits geöffnet ist oder nicht. Ist er geöffnet, sendet er die Daten. Sofern er nicht geöffnet ist probiert er ihn zu öffnen und schlägt dabei aber fehl.

Wenn ich nun allerdings meine Anwendung neustarte, kann er den Port ganz normal öffnen auch wenn keine Close Methode beim Schließen vorhanden ist, warum kann er es beim Neustart aber nicht wenn ich zuvor Abfrage ob der Port geöffnet ist oder nicht ?

Das Verständnis hierzu fehlt mir gerade einfach

Für mich ist allerdings folgendes noch immer unklar, wenn der Port einige Stunden lief ohne Probleme und auf einmal reagiert er nicht mehr auf die gesendeten Daten da der Port angeblich geschlossen ist.

Technisch gesehen ist es so, dass ein SerialPort gar keine Verbindung besitzt. Es gibt kein State "Connected" oder sowas.
Die Realität sieht so aus, dass versucht wird Daten zu senden und entweder es wird akzeptiert, oder nicht. Das "Open" in der .NET Implementierung erstellt dazu nur das Handle, mehr nicht.

Siehe Quellcode dazu hier.

Ein "geschlossen" heisst einfach nur, dass ein Fehler beim Senden passiert ist - oder Du zB in das ReadTimeout läufst.

Hast das Error Event abonniert?

Jedes Mal beim senden fragt er zuvor allerdings ab ob der Port bereits geöffnet ist oder nicht. Ist er geöffnet, sendet er die Daten. Sofern er nicht geöffnet ist probiert er ihn zu öffnen und schlägt dabei aber fehl.

Du kannst auf einen offenen SerialPort kein erneutes Open ausführen. Du musst alles sauber "schließen" via Close, nur dann kann man erneut Open ausführen.

Siehe auch hier der Code dazu aus dem Link:

public void Open()
{
  if (IsOpen)
     throw new InvalidOperationException(SR.Port_already_open);

Wenn ich nun allerdings meine Anwendung neustarte, kann er den Port ganz normal öffnen auch wenn keine Close Methode beim Schließen vorhanden ist, warum kann er es beim Neustart aber nicht wenn ich zuvor Abfrage ob der Port geöffnet ist oder nicht ?

Kenne nun die genaue Implementierung von SerialPort etc nicht; und auch gibts teilweise Unterschiede bei Windows Versionen; aber vielleicht wird hier das Handle automatisch von Windows aufgeräumt, wenn der Parent-Prozess (also Deine Anwendung) geschlossen wird. Oder die Implementierung in .NET ist doch managed, dann wird es automatisch aufgeräumt, wenn der .NET Prozess beendet wird. Müsste man nun im Quellcode mal durch gehen..


Du musst Dir bewusst sein, dass SerialPorts keine stabile Verbindung darstellen; das ist nicht so wie eine Ethernet-Verbindung mit einem entsprechenden Protokoll.

Hallo,
falls es sich bei dem Port um einen USB-RS232-Konverter handelt, könntest Du mal im Gerätemanager nachschauen. Möglicherweise ist da unter Eigenschaften/Energieverwaltung "Computer kann das Gerät ausschalten, um Energie zu sparen" aktiviert.

Gruß Tommix

Ja es handelt sich tatsächlich um ein USB zu RS232. Energieeinstellungen habe ich keine.

Der passende Treiber ist natürlich aktiviert

Damit hatten wir auch schon Probleme. Es gibt tatsächlich Modelle, die einfach nicht zuverlässig funktionieren. Wir liefern zu unseren Geräten immer welche von Delock, die haben sich bewährt - hoffe das war jetzt keine unerlaubte Werbung.

Ich sehe gerade dass mein erster Post nicht ganz korrekt war: Du musst die Energieverwaltung nicht für den Konverter ändern, sonder für den zuständigen USB-Hub (im Zweifelsfall für alle die aufgelistet sind).