Forum: PC-Programmierung COM-Port Unterbrechung bei virtuellem COM-Port erkennen (Windows)


von Be B. (bebo)


Lesenswert?

Hi,

ich stehe vor folgendem Problem.

Ein Gerät soll Daten via eine virtuellen COM-Ports empfangen/senden.

Wenn der USB-Stecker nicht eingesteckt ist, liefert die CreateFile 
Funktion ja ein ungültiges Handle zurück. Also alles klar.

Was aber, wenn der virtuelle COM-Port bei CreateFile eingesteckt war und 
ich den USB-Stecker später im Betrieb einfach herausziehe. Ich habe es 
probiert, aber Windows wirft einfach keine Fehlermeldung raus.

Das dumme, wenn ich den USB-Stecker dann wieder hineinstecke, wird die 
ursprüngliche Verbindung nicht mehr aufgebaut.

Wie kann ein Windows-Programm, wenn es lesen oder schreiben will, denn 
nun herausfinden, ob es einfach loslegen kann, oder ob unter Umständen 
erst das alte Handle geschlossen werden muß, um dann ein neues 
anzufordern? Oder anders, wie kann ein Programm herausfinden, ob ein 
COM-Port noch existiert, ohne CreateFile zu benutzen?

Grüße,
Bebo

von Tobi H. (tobi-) Benutzerseite


Angehängte Dateien:

Lesenswert?

Du kannst dich unter Windows in die DeviceNotifications hängen um über 
Änderungen Informiert zu werden.

Ich hab mal einen Codeschnipsel angehangen, der bei mir funktioniert. 
Das Registryzeug dient dazu den echten Portnamen wieder aus dem 
Devicename zu bekommen.

Tobi

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Mit welcher Programmierspreche arbeitest du? Ich arbeite in RealBasic 
und da geht das wie im folgenden Beispiel - sicher gibt es entsprechende 
Funktionen in anderen Sprachen (VB, Delphi ...):
1
dim i as integer
2
3
port_popup.deleteallrows
4
5
for i=0 to system.serialportcount-1
6
 port_popup.addrow system.serialport(i).name
7
next

Wenn der USB-Adapter nicht dran ist, fehlt der entsprechende Portname 
(z.B. "usbserial1") einfach in der Liste. Über port_popup.listindex 
erhält man dann ein Handle auf den Port, dass man dann z.B. für
1
my_serial=new serial
2
my_serial.port=port_popup.listindex
3
my_serial.baud=9600 ...
4
if my_serial.open then
5
 my_serial.write "blabla"
6
end if

verwenden kann.

Frank

von Be B. (bebo)


Lesenswert?

Hallo ihr beiden,

erst einmal vielen dank. Auf die Idee, die vorhandenen Ports zu prüfen 
war ich nicht gekommen. Habe immer nach etwas gesucht, was direkt mit 
dem Handle in Verbindung stand.

Ich denke, daß ich jetzt weiß, wie vorzugehen ist.

Grüße,
Bebo

von Reinhard Kern (Gast)


Lesenswert?

Be Bo schrieb:
> Das dumme, wenn ich den USB-Stecker dann wieder hineinstecke, wird die
> ursprüngliche Verbindung nicht mehr aufgebaut.

Hallo Bebo,

ich mache das anders: geht die Verbindung verloren (was sich über 
Timeout feststellen lässt, auch wenn kein Handshake definiert ist), geht 
die Software in den Startzustand zurück und versucht eine neue 
Verbindung mit neuem Handle aufzubauen - eben wie beim Programmstart. 
Auf Wunsch bis in die Unendlichkeit. Dazu braucht man nicht mal viel 
zusätzliche Software, und v.a. werden auch alle anderen Fehler wie 
herausgezogenes Verbindungskabel gleichermassen berücksichtigt.

Gruss Reinhard

von Be B. (bebo)


Lesenswert?

Time outs heißt, Du sendes einen Request in periodischen Abständen und 
wartest eine maximale Zeit auf eine Antwort. Kommt dieses nicht wird der 
Port geschlossen. Danach wird erneut versucht den Port zu öffnen? Das 
ist vielleicht die einfachste Möglichkeit.

Da bei mir das USB Interface direkt im Controller sitzt, sollte ich das 
Handshakeproblem nicht haben. Ich habe allerdings zur Zeit noch ein 
anderes Problem mit meiner Software, was jetzt erst einmal gelößt werden 
muß. Hierfür werden ich aber einen gesondereten Thread aufmachen.

Danke und Grüße,
Bebo

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.