Herrausfinden der aktuell vorhandenen COM-Schnittstellen
-
junix schrieb:
Nicht das ich wüsste. Ging bis dato aber immer davon aus...
Ich eigentlich auch...
junix schrieb:
Überrascht mich ehrlich gesagt etwas...
Mich wundert gerade bei den Funktionen, die mit seriellen Schnittstellen zu tun haben, gar nichts mehr. Ich habe z.B. auch feststellen müssen, dass auf einigen Maschinen BuildCommDCB bei COM-Ports über 9 nicht mehr funtionierte

MFK schrieb:
Aber zumindest bedeutet es, dass die Schnittstelle nicht verfügbar ist, da sie belegt wird. Und das reicht ja eigentlich schon. Denn es macht ja keinen Sinn, dem Benutzer die Möglichkeit zu geben, Schnittstellen zu kopnfigurieren, die nicht verfügbar sind?
In dem konkreten Projekt war es ein Problem. Ich brauchte für einen Konfigurationsdialog die tatsächlich vorhandenen Schnittstellen, auch wenn die gerade durch irgendeine andere Anwendung belegt war. Denn so was ist ja nicht zwangsläufig von Dauer.
Nightheros Ansatz hat 2 Nasen:
a) er geht ebenfalls davon aus, dass die Schnittstellen mit COM anfangen
b) Woher krieg ich MAX_COMM_PORTS?Ich hab das gerade mal getestet: GetDefaultCommConfig liefert mir für alles, was über "COM1" hinausgeht, FALSE. GetLastError ist 87, Invalid Parameter.
-
MFK schrieb:
Mich wundert gerade bei den Funktionen, die mit seriellen Schnittstellen zu tun haben, gar nichts mehr. Ich habe z.B. auch feststellen müssen, dass auf einigen Maschinen BuildCommDCB bei COM-Ports über 9 nicht mehr funtionierte

Das liegt daran, das bei comports ab com10 der Gereätebezeichner so auusehen muß:
"\\\\.\\Com10"Es funzt aber auch ab Comport 1.
-
Burkhi schrieb:
Das liegt daran, das bei comports ab com10 der Gereätebezeichner so auusehen muß:
"\\\\.\\Com10"Ich weiß. Aber auch damit schlug BuildCommDCB fehl. Wie gesagt, nicht auf allen Maschinen.
-
MAX_COMM_PORTS ist einfach ein #define, je nach dem, wie weit man die Suche ausdehnen möchte.
"\\\.\\Com10" funktioniert bei mir überhaupt nicht, da bekomme ich immer GetLastError() == 87
Gruß Nighthero
-
Auf Code Project ist ein recht ausführliches Beispiel, sollte man sich vielleicht mal ansehen: http://codeproject.com/system/setupdi.asp?df=100&forumid=4368&exp=0&select=240059
Gruß Nighthero
-
Hallo
hab mal den Link von Nighthero besucht und die Datei heruntergeladen nur das steht was drin was ich nicht verstehe damit das läuft und zwar folgendes.
Ich soll die EnumalSerial.cpp mit der setupapi.lib verlinken
hört sich erstmal gut an aber wie verlinke ich etwas mit etwas anderem er hat nur angegeben wie man es unter Visual C++ macht
Vielleicht weiß einer von euch wie es geht oder was man wo machen kann?
Merci schonmal Felix
-
wie soll das system denn auf einen port zugreifen können der gar nicht existiert. daher ist der getlasterror (87, INVALID_HANDLE_VALUE) ja auch ganz logisch.
am einfachsten ist es, in ner schleife von 1 bis 256 (das ist glaub ich das maximum was geht im system) zu laufen und zu versuchen jeden port zu öffnen. dort wo es gelingt, existiert der port. wo der aufruf fehlschlägt, dem zu folge nicht. letzt sich schön mit nem barcode-reader testen der usb->com macht. einfach immer an nen anderen usb-anschluss haengen und windows generiert jedesmal nen neuen virtuellen com-port...
HANDLE Com; AnsiString PortName; // alle Com-Ports bestimmen for (int i = 1; i <= 256; ++i) { PortName = "COM" + IntToStr(i); // Port öffnen Com = ::CreateFile(PortName.c_str(), GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if (Com != INVALID_HANDLE_VALUE) { // alle gefundenen Ports in ne Listbox packen ListBox1->Items->Add(PortName); // Port wieder schliessen PurgeComm(Com, PURGE_RXABORT); CloseHandle(Com); } }
-
"\\\.\\Com10" war natürlich nur beispielhaft für die Syntax, es schlägt bei mir auf allen Ports fehl!
saTemp.sprintf("\\\\.\\Com%1u", iPort);