www.mikrocontroller.net

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


Autor: Be Bo (bebo)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tobi H. (tobi-) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Frank Esselbach (Firma: Q3) (qualidat)
Datum:

Bewertung
0 lesenswert
nicht 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 ...):
dim i as integer

port_popup.deleteallrows

for i=0 to system.serialportcount-1
 port_popup.addrow system.serialport(i).name
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
my_serial=new serial
my_serial.port=port_popup.listindex
my_serial.baud=9600 ...
if my_serial.open then
 my_serial.write "blabla"
end if

verwenden kann.

Frank

Autor: Be Bo (bebo)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Reinhard Kern (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Be Bo (bebo)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.