Laden...

Kommunikation über serielle Schnittstelle: Wie werden Unterbrechungen (z.B. Kabel gezogen) behandelt

Erstellt von Mallett vor 11 Jahren Letzter Beitrag vor 11 Jahren 2.540 Views
M
Mallett Themenstarter:in
171 Beiträge seit 2012
vor 11 Jahren
Kommunikation über serielle Schnittstelle: Wie werden Unterbrechungen (z.B. Kabel gezogen) behandelt

Hallo,

ich muss derzeit ein Messgerät über eine serielle Schnittstelle ansprechen. Ich verwende dazu System.IO.Ports.SerialPort, und es funktioniert auch alles wie erwartet.

Bei der Verbindung werden im Zeitabstand von 200 ms Daten hin und her geschickt. Meine Frage ist nun: Wenn ich während der Verbindung den Stecker abziehe und nach einer Minute wieder einstecke - sollte die Verbindung dann weiterlaufen ? Oder geht das "Handle" des SerialPort Objekts verloren und ich muss eine neue Instanz anlegen bzw. eine neue Verbidnung anlegen ?

Ich bin mir nicht sicher, ob das Betriebssystem bei der seriellen Schnittstelle erkennt, wenn ein Kabel getrennt wurde (Interrupt ?) oder ob so eine serielle Verbindung völlig "dumm" ist.

Ich habs natürlich ausprobiert und es hat NICHT funktioniert, d.h. nach dem Wiedereinstecken kam nichts mehr an. Das hat mich etwas verwundert, daher die Frage. Vielleicht ist auch an meinem Code noch etwas faul...

Wäre nett, wenn jemand etwas Licht ins Dunkel bringen könnte.

185 Beiträge seit 2005
vor 11 Jahren

Das kommt auf das Protokoll an.
Entweder das Messgerät erkennt die Verbindung über die Steuerleitungen oder du initialisiert die Schnittstellenkommunikation.
Musst du die Datenpakete quittieren? Dann wird vermutlich die Übertragung nach einigen nicht quittierten Paketen beendet.
Etwas mehr Infos wären da hilfreich.

M
Mallett Themenstarter:in
171 Beiträge seit 2012
vor 11 Jahren

Hallo,

nein, es muss nicht quittiert werden, es ist eher ein Frage-Antwort Spiel, also ich frage nach Daten, dann kommen Daten vom Gerät.

Meine Frage zielt aber eigentlich auf die serielle Schnittstelle selbst. Erkennt Windows schon eigenständig, wenn der Stecker gezogen wird ? Wenn ja, ist anschließend dieselbe SerialPort Instanz weiter verwendbar ? Oder muss die Verbindung neu geöffnet werden ?

T
708 Beiträge seit 2008
vor 11 Jahren

Hallo Mallett,

an der Schnittstelle passiert erstmal nichts. Es kommen einfach keine Daten mehr an. Die ausgehenden verbleiben erstmal im Buffer.
Windows erkennt das Trennen des Kabels und entfernt den COM-Port. In der Anwendung gibt es eine Exception, dass der COM-Port nicht mehr erreichbar ist.
Soweit ich mich erinnere, kommt diese Exception aber auch nur wenn du wieder etwas in die Schnittstelle schreiben möchtest.

Kann man also alles abfangen und entsprechend darauf reagieren.

185 Beiträge seit 2005
vor 11 Jahren

Die Instanz sollte eigendlich weiterhin zur Verfügung stehen.
Daten, die Geschrieben werden, landen einfach im Nirwana 😉

Ob der Stecker gezogen wird, erkennst du (wenn angeschlossen) über die Handshake-Leitungen.

J
2 Beiträge seit 2012
vor 11 Jahren

Handelt es sich um eine richtige serielle Schnittstelle oder einen USB-RS232 umsetzer?

U
1.688 Beiträge seit 2007
vor 11 Jahren

Handelt es sich um eine richtige serielle Schnittstelle oder einen USB-RS232 umsetzer?

Mit anderen Worten - bei der USB-Variante geht die Schnittstelle im System verloren und müsste deshalb wieder neu geöffnet werden. Ansonsten erkennt das System das Entfernen des (seriellen) Steckers nicht.

M
Mallett Themenstarter:in
171 Beiträge seit 2012
vor 11 Jahren

Es geht nicht um einen virtuelen COM Port über USB, da ist klar, dass die Verbindung weg ist, da ds virtuelle "Gerät" ja garnicht mehr vorhanden ist, wenn man den Stecker entfernt.

Zu der ursprünglichen Frage bin ich genauso schlau wie vorher, hier sind ja beide Meinungen in den Antworten vrtreten, wer hat nun Recht ? 😃

W
123 Beiträge seit 2008
vor 11 Jahren

Hallo,

richtig ist, dass das Betriebssystem das Ziehen des Steckers nicht mitbekommt.

Allerdings merkt die Software des angeschlossenen Gerätes und die PC-Software sehr wohl, wenn die Datenübertragung plötzlich nicht mehr läuft. Du müsstest dich mal schlau machen, wie die Software des Messgerätes in so einen Fall reagiert und davon ausgehend vielleicht spezielle Maßnahmen zur Reaktivierung durchführen.

Gruß
wolpertinger

C
258 Beiträge seit 2011
vor 11 Jahren

Das kommt auf das Protokoll / den Handshake an.

Bei mir funktioniert es grundsätzlich den Stecker zu ziehen und wieder anzustecken.
Jedoch musst du die Kommunikation des Messgerätes und deines Programms auch dafür auslegen solche Fehler (Timouts & fehlerhafte Pakete) zu Ignorieren, was bei mir nicht so ist. Wird ein fehlerhaftes Paket nicht mehr Quittiert trennt (in meinem Fall) die Steuerung die Verbindung. Dh. Das ausstecken würde nur funktioniert wenn die Verbindung gerade inaktiv ist. Deswegen trenne ich die Verbindung Immer wenn ein Timeout auftritt.

M
Mallett Themenstarter:in
171 Beiträge seit 2012
vor 11 Jahren

Also es gibt da kein besonderes Protokoll. Das heißt, das Messgerät trennt definitiv nicht die Verbindung nach einer gewisse Zeit, auf Seite des Messgeräts gibt es keine weiterführende Logik. Das Messgerät wartet in einer Endlosschleife auf eine Anfrage über den COM-Eingang und sendet dann sofort eine Antwort zurück.

Die Logik liegt eigentlich be mir im Code, und beschränkt sich darauf, zu verhindern, dass mehr als ein Kommando gleichzeitig geschickt wird (ansonsten gibt es einen Crash auf der Leitung). D.h. Software sendet ein Kommando und wartet auf Antwort, Messgerät antwortet, Software sendet nächstes Kommando usw.

Also würde ich grundsätzlich erwarten, dass die Kommunikation auch wieder weiter läuft, wenn das Kabel wieder eingesteckt wird. Dem ist aber nicht so - wenn also die Aussage, dass es bei der seriellen Leitung funktionieren müsste, richtig ist, dann liegt der Schluss nahe, dass die Behandlung einer nicht eingehenden Antwort des Messgeräts in meiner Software faul ist und die Software in einen Deadlock gerät, so dass nichts mehr geschickt wird.

D.h. ich muss also doch mal genau rein debuggen und schauen was abgeht. Ich wollte mit der Frage nur sicher stellen, dass die Kommunikation deshalb nicht weiter läuft, weil es grundsätzlich nicht funktionieren kann. Ich weiß nicht wie Windows mit einer SerialPort Verbindung umgeht, ob es ein Handle der Verbindung hält, welches vielleicht verloren geht, wenn der Stecker gezogen wird o.Ä.

185 Beiträge seit 2005
vor 11 Jahren

Du musst einen Timeout bei dem warten auf die Antwort einbauen.
Ansonsten wartest du ja für immer auf eine Antwort, die das Messgerät schon längst geschickt hat, du aber wegen der Unterbrechung nicht empfangen hast.
Und das Messgerät wartet auf das nächste Komando.