Bestimmtes Gerät an COM-Ports finden
-
Servus,
ich hoffe, ich bin hier im richtigen Forum - nachdem ich im "C++" Forum schon auf Unpässlichkeit hingewiesen wurde

Also: Ich hab hier einen µC mit dem ich gern Daten über die serielle Schnittstelle austauschen möchte - das klappt auch soweit bestens.
Allerdings muss ich bisher, wenn ich mit meinem C++ Programm eine Verbindung zum µC aufbauen will, den COM-Port, an dem das Gerät hängt, wissen. Das möchte ich vermeiden. Gibt es eine Möglichkeit, Geräte-spezifische Informationen abzufragen, um herauszufinden, an welchem COM mein Gerät hängt?
Es handelt sich übrigens um einen virtuellen COM-Port, das heißt, der µC wird an einen USB Port angeschlossen und emuliert dann eine COM-Schnittstelle. Das Schöne daran: Ich habe zB eine PID und VID, wie mans beim USB halt gewohnt ist. Könnte ich die irgendwie auslesen, um das Gerät zu identifizieren?
Hier noch mein Code, mit dem ich das Gerät bisher anspreche:
#ifndef __DEV_H__ #define __DEV_H__ class Serial_Device { public: Serial_Device(); // Konstruktor ~Serial_Device(); // Destruktor int Open (void); void Close(void); void Write(unsigned char*, DWORD*); void Read (unsigned char*, DWORD*); string GetErrorMessage(); protected: HANDLE DeviceHandle; DCB Port; string ErrorMessage; }; #endif __DEV_H__#include "stdafx.h" Serial_Device :: Serial_Device() { DeviceHandle = NULL; } Serial_Device :: ~Serial_Device() { CloseHandle(DeviceHandle); } int Serial_Device :: Open(void) { // open port for I/O DeviceHandle = CreateFile(L"COM5", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if(DeviceHandle == INVALID_HANDLE_VALUE) { ErrorMessage = "Port konnte nicht geöffnet werden."; CloseHandle(DeviceHandle); return 1; } // set timeouts COMMTIMEOUTS Timeout = { 1, 100, 1000, 0, 0 }; if(!SetCommTimeouts(DeviceHandle, &Timeout)) { ErrorMessage = "Timeout konnte nicht festgelegt werden."; CloseHandle(DeviceHandle); return 1; } // set Port memset(&Port, 0, sizeof(Port)); Port.DCBlength = sizeof(Port); Port.BaudRate = 115200; // Baudrate 115,200 kbps Port.Parity = NOPARITY; // keine Parität Port.StopBits = ONESTOPBIT; // 1 Stopbit Port.ByteSize = 8; // 8 Datenbits Port.fBinary = 1; // Binärmodus: Muss gesetzt sein Port.fDtrControl = DTR_CONTROL_ENABLE; // Flusskontrolle aktivieren Port.fRtsControl = RTS_CONTROL_ENABLE; if(!SetCommState(DeviceHandle, &Port)) { ErrorMessage = "Port konnte nicht konfiguriert werden"; CloseHandle(DeviceHandle); return 1; } return 0; } void Serial_Device :: Write(unsigned char* Buf, DWORD* BufLen) { WriteFile(DeviceHandle, Buf, *BufLen, BufLen, NULL); // BufLen wird mit der Anzahl der gesendeten Bytes überschrieben } void Serial_Device :: Read(unsigned char* Buf, DWORD* BufLen) { ReadFile(DeviceHandle, Buf, sizeof(Buf), BufLen, NULL); // read is updated with the number of bytes read }
-
ich hoffe, ich bin hier im richtigen Forum - nachdem ich im "C++" Forum schon auf Unpässlichkeit hingewiesen wurde
Mach' Dir nix draus - Die Gralshüter der unbefleckten Sprache brauchen ja auch eine Aufgabe

Für die COM-Schnittstelle gibt es leider kein Protokoll, was Dir Informationen über ein angeschlossenes Gerät gibt, du kannst nur hoffen, daß das Gerät selbst eine Kennung zurückliefern kann.
der VID/PID, den du siehst, sind nur die IDs des USB-COM-Adapters, sagen also auch nichts über den Microcontroller.
Vielleicht findest du was zu dem USB-COM-Adapter selbst.
-
Hi Schnapphase,
hab zu diesem thema was ähnliches geschrieben: http://www.c-plusplus.net/forum/viewtopic-var-t-is-194724.htmlLasse einfach mal EnumSerialPorts (mittlerweile in Version 1.19) bei Dir laufen und guck Dir die Ausgabe an.
Ich denke, das ist es was Du suchst, und Sourcen sind ja dabei!Bei Fragen einfach in die tasten hauen...
Martin