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
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
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.