[C++] Schnittstellenerkennung

DexXxtrin

Erfahrenes Mitglied
Hallo zusammen

Ich muss für eine Hardware ein Prgramm schreiben in C++ (Windows). Die Hardware wir mittels USB mit dem PC verbunden und erstellt dann eine COM-Schnittschtelle. Um mit dieser Hardware zu kommunizieren, sollte ich wissen welcher COM sie verwendet. Wie kann ich das rausfinden?
Gibt es eine Möglichkeit über C++ die Einträge des Gerätemanagers auszulesen?

Gruss DexXxtrin
 
Hallo,

über diesen Registry-Schlüssel kannst du alle im PC verfügbaren seriellen Schnittstellen auflisten:
Code:
HKLM\Hardware\DeviceMap\SerialComm

Gruß
MCoder
 
Danke für die Antwort.
Jetzt möchte ich aber den COM Port (COMXX) und der Name, welcher im Gerätemanager angezeigt wird sehen.
Nun bin ich auf folgende Befehle gestossen und habe diese verwendet. Allerdings weiss ich nicht genau, wie ich jetzt das auslesen kann, was ich will...

Code:
HDEVINFO hDevInfo;
	GUID GUID_DEVCLASS_PORTS;
	DWORD MemberIndex=0;
	DWORD dwRegType;
	DWORD ReqSize;
	BYTE buffer;
	SP_DEVINFO_DATA DevInfoData;

	hDevInfo = SetupDiGetClassDevs(&GUID_DEVCLASS_PORTS, NULL, NULL, DIGCF_PRESENT);
	DevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
	while(SetupDiEnumDeviceInfo(hDevInfo, MemberIndex, &DevInfoData))
	{
		MemberIndex++;
		SetupDiGetDeviceRegistryProperty(hDevInfo,&DevInfoData, SPDRP_ADDRESS , &dwRegType, &buffer,sizeof(buffer),NULL);
	}
	printf("Error %d.\n", GetLastError());
 
Hmm, mit der API habe ich noch nicht gearbeitet. Da wirst du dich wohl durch die Beschreibungen in der MSDN durcharbeiten müssen.

Gruß
MCoder
 
Gut das hätte ich dann auch geschaft.
Nun gibt mir diese Funktion einfach alle Namen der Geräte an. Wie kann ich zusätzlich auch noch bei dem Gesuchten den COM-Port anzeigen lassen?
 
Ich habe es nun selbst gelöst.

Code:
void SeriallPort()
{
	HDEVINFO hDevInfo;
    SP_DEVINFO_DATA DeviceInfoData;
    DWORD i;
	double dFound = false;
    // Create a HDEVINFO with all present devices.
    hDevInfo = SetupDiGetClassDevs(NULL, 0, 0, DIGCF_PRESENT | DIGCF_ALLCLASSES );
       
    if (hDevInfo == INVALID_HANDLE_VALUE)
    {
		printf("Error %d.\n", GetLastError());
    }
	
	// Enumerate through all devices in Set.
	DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
    for (i=0;SetupDiEnumDeviceInfo(hDevInfo,i, &DeviceInfoData);i++)
    {
		if(!dFound)
		{
			DWORD DataT;
			DWORD sDataT;
            LPTSTR buffer = NULL;
		    LPTSTR wbuffer = NULL;
            DWORD buffersize = 0;
		    DWORD wbuffersize = 0;
		    std::string sBuffer;
			//
			// Call function with null to begin with,
			// then use the returned buffer size (doubled)
			// to Alloc the buffer. Keep calling until
			// success or an unknown failure.
			//
			//  Double the returned buffersize to correct
			//  for underlying legacy CM functions that
			//  return an incorrect buffersize value on
			//  DBCS/MBCS systems.
			//
			while (!SetupDiGetDeviceRegistryProperty( hDevInfo, &DeviceInfoData, SPDRP_DEVICEDESC, &DataT, (PBYTE)buffer, buffersize, &buffersize))
			{
				if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
				{
					// Change the buffer size.
					if (buffer) LocalFree(buffer);
					// Double the size to avoid problems on
					// W2k MBCS systems per KB 888609.
					buffer = (char*)LocalAlloc(LPTR,buffersize * 2);
				}
				else
				{
					printf("Error %d.\n", GetLastError());
				}
			}
			sBuffer = buffer;
			if(sBuffer == "DeviceName")
			{
				while (!SetupDiGetDeviceRegistryProperty( hDevInfo, &DeviceInfoData, SPDRP_FRIENDLYNAME, &sDataT, (PBYTE)wbuffer, wbuffersize, &wbuffersize))
				{
					if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
					{
						// Change the buffer size.
						if (wbuffer) LocalFree(wbuffer);
							// Double the size to avoid problems on
							// W2k MBCS systems per KB 888609.
							wbuffer = (char*)LocalAlloc(LPTR,wbuffersize * 2);
					}
					else
					{
						printf("Error %d.\n", GetLastError());
					}
				}
				   
				// Extract the seriell portname
				BufSave = wbuffer;
				int first, last;
				first = BufSave.find("(");
				BufSave.erase(0, first+1);
				last = BufSave.find(")");
				BufSave.erase(last, 1);
				   
				printf("Result:[%s]:[%s]\n",buffer,BufSave.c_str());
				dFound = true;
			}
			   
			if (buffer) LocalFree(buffer);
			if (wbuffer) LocalFree(wbuffer);
		}
	}
	   
	if ( GetLastError()!=NO_ERROR && GetLastError()!=ERROR_NO_MORE_ITEMS )
    {
		printf("Error %d.\n", GetLastError());
	}
       
    //  Cleanup
    SetupDiDestroyDeviceInfoList(hDevInfo);
}
 
Zuletzt bearbeitet:
Zurück