Hallo,
ich möchte in meinem Programm den seriellen Port automatisch erkennen,
an dem mein Gerät angeschlossen ist. Ich habe jetzt ein Programmstück
geschrieben, das alle Ports öffnet und durch einen Erkennungsbefehl auf
eine Antwort wartet. Der Befehl ist "@\n" und soll den Anwendungsname
zurückgeben. Danach vergleiche ich durch if, ob die erhaltene Antwort
mit der erwarteten passt. Mein Programm läuft jetzt ganz schön. Aber was
ich fragen möchte: kann es gefährlich sein, alle geöffnete Ports einfach
Daten zu senden? Gibt es oder elegantere Lösungen?
Die Parameter für Ports sind:
Java Code:
endidu schrieb:> kann es gefährlich sein, alle geöffnete Ports einfach> Daten zu senden?
Im Prinzip ja, wenn da eine Herz-Lungenmaschine dran hängt und du ihr
das Kommando für Notfallabschaltung sendest... ;)
Solange kein Gerät dranhängt was es dir krumm nimmt wird nix passieren.
endidu schrieb:> Hallo,>> ich möchte in meinem Programm den seriellen Port automatisch erkennen,> an dem mein Gerät angeschlossen ist. Ich habe jetzt ein Programmstück> geschrieben, das alle Ports öffnet und durch einen Erkennungsbefehl auf> eine Antwort wartet. Der Befehl ist "@\n" und soll den Anwendungsname> zurückgeben. Danach vergleiche ich durch if, ob die erhaltene Antwort> mit der erwarteten passt. Mein Programm läuft jetzt ganz schön. Aber was> ich fragen möchte: kann es gefährlich sein, alle geöffnete Ports einfach> Daten zu senden? Gibt es oder elegantere Lösungen?
Elegantere Lösung: Falls das Gerät tatsächlich noch eine richtige
Serielle hat, nicht wirklich. Falls da irgendwo ein USB->Seriell
irgendwas dazwischen hängt, ja (da diese meistens eine (änderbare)
Seriennummern o.ä. haben, die abgefragt werden kann).
Danke schön für die Antworten.
Arc Net schrieb:> Falls das Gerät tatsächlich noch eine richtige> Serielle hat, nicht wirklich.
Was meinst du eigentlich mit der richtigen Serielle? Da ich mich bis
jetzt wenig mit Hardware beschäftigt habe, ist mir vieles neu. Deswegen
entschuldige ich mich im Voraus für die eventuell blöde Fragen. Also es
handelt sich um eine virtuelle com port. Wenn ich das Gerät an meinem
Computer anschließe, erscheint noch ein zusätzlicher Com port (also
COM3). Ich weiss, dass mein Gerät dran angeschlossen ist, aber ich
möchte es trotzdem automatisch erkennen, da das Gerät später nicht nur
an meinem Computer angeschlossen sein wird.
wenn ich dann so annehme, dass es nicht gefährlich ist, eine Abfrage zu
schicken und drauf eine Antwort zu warten, habe ich dann noch eine
Frage:
Ist es dann auch nicht gefährlich, die Ports mit hohem/niedrigem
Baudrate ansprechen?
Direkt gefährlich nicht, aber es ist und bleibt Gefrickel und unsaubere
Bastler-Programmierung. Wenn das eine virtuelle Sereille ist, dann ist
das ganz einfach. Da schaut man in die Registry, an welchem COM Port der
entsprechende USB-Serial Wandler hängt. Falls es ein FTDI ist, kannst du
nach folgendem Beispiel vorgehen:
http://www.ftdichip.com/Support/Knowledgebase/wherecanifindport.htm bei
anderen herstellern analog dazu. Dann noch in
HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOM nachschauen, ob der
gerde eben angeschlossen ist. Das ist die saubere Variante.
Christian R. schrieb:> Direkt gefährlich nicht, aber es ist und bleibt Gefrickel und unsaubere> Bastler-Programmierung. Wenn das eine virtuelle Sereille ist, dann ist> das ganz einfach. Da schaut man in die Registry, an welchem COM Port der> entsprechende USB-Serial Wandler hängt. Falls es ein FTDI ist, kannst du> nach folgendem Beispiel vorgehen:> http://www.ftdichip.com/Support/Knowledgebase/wherecanifindport.htm bei> anderen herstellern analog dazu. Dann noch in> HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOM nachschauen, ob der> gerde eben angeschlossen ist. Das ist die saubere Variante.
Einfacher geht's wenn man die Funktionen aus der FT2DXX.dll nimmt, bei
den SiLabs-Teilen über die CP210xManufacturing.DLL
http://www.silabs.com/pages/DownloadDoc.aspx?FILEURL=Support%20Documents/TechnicalDocs/an197.pdf&src=DocumentationWebPart
Naja, was bei solchen gewollt und nicht gekonnt PnP auf Schnittstellen,
die das gar nicht hergeben rauskommt, sieht man, wenn man eine serielle
GPS Maus beim Windows Start angeschlossen hat. Da hat man dann gleich
eine serielle Maus automatisch "erkannt" und der Cursor macht die
wildesten Sachen. Echtes PnP geht mit echtem COM Ports nicht. Das ist
einer der Vorzüge von USB, und besonders der USB COM Ports, da kann man
wenigstens zweifelsfrei erkennen, ob es jetzt das Zielgerät ist.
Danke für die Antworten. Ich habe dazwischen eine andere Frage. Wie kann
man erkennen ob ein USB-Stick während des Programmlaufes eingesteckt
bzw. entfernt wurde? Also, wie gesagt, es handelt sich um einen
virtuellen Com Port und mein Programm ist in Java geschrieben. Ich habe
im Google einige Lösungen gefunden. die sind aber veraltet, bzw. werden
nicht mehr weiter entwickelt, wie javax.usb usw.
Es gibt aber Lösungen in VB. Kann ich die irgendwie in Java benutzen?
Morgen,
Christian R. schrieb:> Direkt gefährlich nicht, aber es ist und bleibt Gefrickel und unsaubere> Bastler-Programmierung. Wenn das eine virtuelle Sereille ist, dann ist> das ganz einfach. Da schaut man in die Registry, an welchem COM Port der> entsprechende USB-Serial Wandler hängt. Falls es ein FTDI ist, kannst du> nach folgendem Beispiel vorgehen:> http://www.ftdichip.com/Support/Knowledgebase/wher... bei> anderen herstellern analog dazu. Dann noch in> HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOM nachschauen, ob der> gerde eben angeschlossen ist. Das ist die saubere Variante.
Jetzt habe ich so nachgeschaut und ich finde unter
HKEY_LOCAL_MASHINE\SYSTEM\CurrentControlSet\Enum\USB\Vid_0000&Pid_0000
und es gibt in diesem USB Folder drei so ähnlice Unterordner. Aber mein
Device befindet sich unter USB\Vid_0000&Pid_0000 in einem Ordner, der
mit 5&2fd... anfängt.
Eigentlich es könnte mir für mein neues Porblem reichen, wenn ich in
HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOM irgendwie ein Listener
registieren kann, der beim einstecken bzw. ausstecken eines USB ein
Event auslöst. Kann man sowas in Java machen?
Danke im Voraus.
Du musst natürlich in der Registry im passenden zweig schauen, der von
der VID und PID zu dem in deinem Gerät verbauten Wandler passt. Das
Beispiel gilt ja nur für FTDI dort.
Und nein, SERIALCOM zu beobachten reicht nicht, denn da bekommst du ja
nicht raus, was sicher hinter COM1 oder COM7 oder sonstwas verbirgt.
Dazu musst du schon den entsprechenden Zweig im USB Enumerator mit
beachten. Denn darüber bekommst du die Info, welcher COM zu welchem
USB-Serial Wandler gehört, und über SERIALCOM, ob der momentan
angesteckt ist.
Und Hot plug Events fängt man mit der Windows API und der Funktion
RegisterDeviceNotification ab. Da hat man doch aus Java sicher auch
Zugriff...
Hier mal die C++ Umsetzung:
http://www.codeproject.com/KB/system/HwDetect.aspx
Danke für die Antwort. Zur Zeit überwache ich virtuelle Ports durch
Thread-Klassen jede halbe Sekunde, ob ein neuer Com Port verfügbar ist.
und wenn ja, kontrolliere ich, ob es sich um mein Gerät handelt, indem
ich den Anwendungsname abfrage.
ich weiss, das ist keine schöne Lösung ist, aber es reicht mir zur Zeit.
Ich werde mich aber weiter mit diesem Thema beschäftigen, damit ich eine
elegantere Lösung finde.