Forum: PC-Programmierung über COM Ports Erkennungsdaten senden


von endidu (Gast)


Lesenswert?

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:
1
int baudrate = 57600;
2
int dataBits = SerialPort.DATABITS_8;
3
int stopBits = SerialPort.STOPBITS_1;
4
int parity = SerialPort.PARITY_NONE;
Danke im Voraus.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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.

von Arc N. (arc)


Lesenswert?

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).

von endidu (Gast)


Lesenswert?

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?

von Christian R. (supachris)


Lesenswert?

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.

von Arc N. (arc)


Lesenswert?

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

von Christian B. (casandro)


Lesenswert?

Es gibt meines Wissens nach irgendwo ein Plug&Play Spezifikation für 
solche Geräte. Ich weiß aber nicht ob die jemals irgendwer implementiert 
hat.

von Christian R. (supachris)


Lesenswert?

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.

von endidu (Gast)


Lesenswert?

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?

von endidu (Gast)


Lesenswert?

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.

von Christian R. (supachris)


Lesenswert?

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

von endidu (Gast)


Lesenswert?

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.

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.