# Richtigen COM-Port bestimmen



## meister-g (5. Mrz 2010)

Hi!

über diese
USB to UART Bridge VCP Drivers
Treiber schließe ich ein Gerät über USB an die serielle Schnittstelle an.

Über die Bibliothek SerialPort von SerialIO, die javax.comm wrapt und quasi plattformunabhängig macht kann ich wunderbar auf das Gerät zugreifen.

Es ergibt sich aber ein großes Problem: Ich weiss nicht an welchem COM-Port mein Gerät ist.
(Momentan gebe ich mir die COM-Ports aus und weiß dann - da es der einzige bzw der mit der höheren Nummer ist - zu welchem Port ich connecten muss und mach das dann manuell)

Böse wäre nun zu allen COM-Ports auslesen und nach den richtigen Daten zu scannen. Müsste aufgrund eines speziellen Protokolls super funktionieren. Hier kann ich aber fatalerweise für kurze Zeit einen falschen COM-Port in Beschlag nehmen.
Wie komme ich also an die Info an welchem COM-Port mein Gerät hängt?

Über ein C#-Tool mit WMI habe ich es hinbekommen, indem ich die USB-Ports auslese, das mit der richtigen Vendor und Produkt-ID nehme und über die DeviceID den COM-Port erhalte.
Kann ich das irgendwie auch plattformunabhängig herausfinden?

Wenn nicht, was ist die schnellste/einfachste Möglichkeit für Windows (Mac, Linux)?
Falls ich in Java über USB zugreife - kann ich dann auch den COM-Port auslesen wie über WMI? Welche USB-Library verwende ich dann? Gibt es evlt eine wie SerialIO, die alle möglichen Betriebssysteme handled?

Mir fallen also folgende Möglichkeiten ein:
- unter Win eigenes C# Tool aufrufen (was mach ich bei einem Mac/Linux etc.?)
- auf WMI über Java zugreifen (was mach ich bei anderen Systemen?)
- Java USB Library verwenden (welche? unterstützte Plattformen? komme ich an den COM-Port?)
- ??? (evtl irgendetwas ganz simples wie System.getProperty... oder evtl. direkt über den COM-Port irgendetwas wie die Seriennummer zu erhalten)

Ich bin für jeden Tip dankbar, wie ich möglichst ohne zusätzliche Libraries, möglichst plattformunabhängig (wenn nicht möglich mindestens für Win/Mac) möglichst einfach herausfinden kann an welchem Port mein Gerät hängt. Habe wie gesagt die Treiberinformationen (siehe oben - CP210), Vendor & Produkt-ID und Seriennummer.


----------



## Gast2 (5. Mrz 2010)

> Wie komme ich also an die Info an welchem COM-Port mein Gerät hängt?


genau so:


meister-g hat gesagt.:


> allen COM-Ports auslesen und nach den richtigen Daten zu scannen. Müsste aufgrund eines speziellen Protokolls super funktionieren.






> Über ein C#-Tool mit WMI habe ich es hinbekommen, indem ich die USB-Ports auslese, das mit der richtigen Vendor und Produkt-ID nehme und über die DeviceID den COM-Port erhalte.
> Kann ich das irgendwie auch plattformunabhängig herausfinden?


nein ... WMI gibt es nur für Windows ... und Java kenn (AFAIK) werder Com-Port noch USB ... Du kannst Dir aber die Mühe machen und WMI für Java mitels JNI umsetzen

hand, mogel

PS: wenn es keinen vernüftigen Grund gibt es mit Java zu machen - wieso bleibst Du dann nicht bei C#?


----------



## meister-g (6. Mrz 2010)

com und usb gibt es unter java nicht, richtig.
aber wie gesagt ist serialport von serialio quasi für jede plattform implementiert. daher war meine frage ob es eine ähnliche library für usb gibt und ob man damit wie unter wmi den com-port erhält, der hinter dem usb-anschluss steckt.

wmi gibt es nach einer minirecherche auch eine java-bibliothek...aber wenn ich über wmi gehe muss ich keine java-bibliothek verwenden sondern kann auch ein externes c#tool verwenden, welches ich habe. warum ich c# nicht generell verwende ist klar: die ganze software läuft schon unter java. das c# tool ist eben nur ein bisschen wmi code, dass den richtigen com-port ermittelt. den aufruf eines externen windows-tools möchte ich aber vermeiden. 100% java geht wohl nicht. aber eben gute betriebssystemübergreifende bibliotheken wie serialio. 

oder noch einmal die andere variante: alle com-ports scannen und nach einem speziellen protokoll (bytefolge,crc,etc) überprüfen. ist das ein unding, unschön, oder ein vernünftiges verfahren? ganz kurze zeit kann ich eben einen "fremden" com-port öffnen, der dann für diese kurze zeit nicht zur verfügung steht.


----------



## Gast2 (6. Mrz 2010)

meister-g hat gesagt.:


> ganz kurze zeit kann ich eben einen "fremden" com-port öffnen, der dann für diese kurze zeit nicht zur verfügung steht.



die Variante sehe ich nicht so tragisch ... wenn ich Daten über COM erwarte, dann öffne ich den Port am Programmanfang ... somit würdest Du schon mal gar nicht darauf zugreifen können - ergo - es ist nicht Dein Port


----------



## meister-g (8. Mrz 2010)

mogel hat gesagt.:


> die Variante sehe ich nicht so tragisch ... wenn ich Daten über COM erwarte, dann öffne ich den Port am Programmanfang ... somit würdest Du schon mal gar nicht darauf zugreifen können - ergo - es ist nicht Dein Port



ist es auch wirklich sicher, dass ich durch connecten und lesen kein gerät/keine software stören kann indem z.b. dann auch mit falscher baudrate etc verbunden wird?


----------



## tuxedo (8. Mrz 2010)

Wieso lässt du das nicht einfach den User konfigurieren? Wenn auch der es nicht weiß, kannst du ihm die bereits genannte Auto-Suche nach dem Com-Port anbieten.

- Alex


----------



## Tharsonius (8. Mrz 2010)

Wenn bereits ein Gerät über einen COM Port verbunden ist, dann ist der COM Port schon geöffnet. Dies kannst Du beim Öffnen abfangen.

Wenn Du nun automatisch scannen möchtest, dann weisst Du ja nicht welche COM Ports vorhanden sind und oben drein, welche bereits benutzt werden.

1. Ports öffnen. Wenn Port nicht vorhanden oder bereits geöffnet, dann ignorieren
2. Auf allen nun neu geöffneten Ports eine Init Nachricht senden und auf Antwort warten.
3. Wenn Antwort kommt, diesen Port verwenden und alle anderen schliessen

So hab ich das bei mir programmiert. Klappt gut. Ich hab das ganze noch mit einem Timeout versehen, will ja nicht ewig warten.


----------



## meister-g (8. Mrz 2010)

das Gerät schickt sowieso die ganze Zeit von sich aus Daten.
Auch hier lässt sich eben evtl wieder diskutieren, ob es besser ist einem fremden COM-Port eine Steuermeldung zu schicken oder eben den COM-Port auszulesen (das mach ich gerade).
Es klappt wie beschrieben die Ports zu scannen. Wie gesagt frage ich mich aber ob es irgendeine Software/ein Gerät stören kann, wenn ich einen fremden Port kurz (mit falscher Baudrate?) scanne.

Es hat sich auch ein anderes Problem ergeben, ich möchte aber keinen neuen Thread erstellen. Evtl kann hier auch jemand helfen:
Und zwar erscheint über die anfangs erwähnten Treiber bei eingeschaltetem Gerät ein neuer COM-PORT im System. 
Schalte ich das Gerät _nach_ dem ersten 
	
	
	
	





```
CommPortIdentifier.getPortIdentifiers();
```
 ein, so wird nach dem Einschalten der Port über den gleichen Befehl nicht gelistet (erst wieder nach Neustart der Applikation). Gibt es da über die javacomm oder serialio irgendeine Möglichkeit "nachzuladen"?


----------



## Floydmovie (27. Sep 2010)

Hallo

Habe ein änliches Problem.

Ich habe ein Gerät (Barcode Scanner). Nun geht es darum, wenn ich das Gerät einstecke das ich über eine Batch datei (kann auch mit c oder c# geschehen) auslesen und diese anschliessend in ein TextFile speichern kann.

Wie ich gelesen habe ist dier dieses gelungen! Wie hast du dies hingekriegt?

Gruss Carlo


----------



## Ralph-Uwe (27. Sep 2010)

Hallo,

ich habe vor kurzen eine Anbindung eine Druckers über eine Serielle Schnittstelle umgestetzt.
Bei meinen erste Versuchen habe ich auch javax.comm benutzt, habe dann aber auf RXTXComm
gewechselt. 
Das Einstellen der Ports ist in beiden Lib's gleich. Allerdings bietet RXTXComm beim senden von Strings 
mehr Möglichkeiten.

@ meister-g:
spricht etwas dagegen die Port abfrage mehrmals zu wiederholen? Stichwort Timertask.

@ Floydmovie:
Barcodescanner so einstellen, dass nach jedem scan ein Return mit gesendet wird.
Texteditor öffnen 
Barcode scannen und als Textfile speichern.


----------



## Floydmovie (28. Sep 2010)

Danke für die rasche Antwort.

Ne ich meine nicht das Scannen selber. Ich habe die software für den Barcode. Leider ist die sehr schlecht und man muss manuel den Port des Scanners eintragen (COM1, COM2 ...). Ich habe gesehen dass das Programm ein Text File hat das die Einstellungen speichert.
Meine Idee ist nun eine Batch zu schreiben der zuerst den COM Port auslist und danach dies in dieses TextFile speichert. Zumschluss die Software Starten und alle einstellungen wären getroffen.

Nun wie kann ich nun den Port des Scanners herauslesen?

Gruss Carlo


----------



## Ralph-Uwe (28. Sep 2010)

Moin

wenn das Programm die Einstellung speichert, warum willst Du dann der Port erst ermittel?

Vielleich kann Du das Programm auch gleich mit den richtigen Parametern aufrufen:
z.B. Scanner.exe COM1

Edit: ich gehe davon aus, dass der Scanner immer am selben Port hängt!


----------



## Floydmovie (1. Okt 2010)

Habe es hinbekommen.

Ich starte ein exe das die Schnittstelle einliest. Die Schnittstelle speichert es dan in ein Einstellungsfile des anderen Programmes. Nach dem wird das richtige Programm ausgeführt und lädt die Einstellungen.


----------



## joergimd (25. Nov 2012)

hallo.
besteht die möglichkeit das ich die Comport-abfragesoftware auch bekommen kann?

habe eine USB-I/O Karte HB628 welche bei jedem neuen anstecken immer eine andere Comport-nummer hat.

Ich suche nach einer Möglichkeit, dieses Comport-nummer herausfinden zu automatisieren und gleich in die konfig-dateien für das Karten-Anwenderprogramm zu schreiben. 
Damit dann alles zusammen nur 1 Programmstart wird.

1xstarten macht dann 
1. Comport scannen wo ist die HB628?
2. Comportnummer in die Konfigs für die HB628 schreiben.
3. Anwenderprogramm gleich mit der richtigen Comportnummer starten.

Profilab Expert ist vorhanden. aber bisher keine Möglichkeit dafür gefunden.

mfg

joerg.schiller1@gmx.de


----------



## Ralph-Uwe (25. Nov 2012)

Hallo,

den Download gibt es hier:
Rxtx


und hier findest Du einen Beispielcode:
http://www.java-forum.org/java-basi...t-string-bits-bytes-umwandeln.html#post953121

Ich hoffe, dass hilft Dir weiter!


----------

