Welche Ports aktiv?



  • Hallo 😉

    kann mir vielleicht jemand sagen, wie man herausfindet, welcher Port am PC aktiv ist und welcher nicht?
    Vorallem dann im BCB das herauslesen, welcher aktiv ist...

    ich hab seriell etwas angesteuert, per USB
    und da kann der ComPort schnell einmal wechseln,
    daher wil ich im Programm auch nicht gleich festlegen, dass man den Port immer
    auf 2 ändern muss 😉

    vielen dank schonmal für eure hilfe!

    mfg
    wolfshuendchen



  • Ich glaube, das kriegst du mit den SetupDiEnum[...]-Funktionen raus. Das ist aber ein ziemliches Gewurschtel, also such besser im Netz nach einer halbwegs fertigen Lösung (oder jemand gibt dir vielleicht hier eine).



  • mhm.. also im net hab ich noch nichts nützliches gefunden :S
    und die Funktion ist bei mir weder definiert (welche Bibliothek müsste ich denn einfügen?) noch im Hilfemenue auffindbar ^^'

    mfg
    wolfshuendchen



  • Hm, du hast Recht. Die Funktionen sind wirklich schwer zu finden, wenn man den genauen Namen nicht kennt. Auf msdn.com findet man nix mit "SetupDiEnum"...

    Tipps: Eine Funktion lautet SetupDiEnumDeviceInfo!

    Wenn man dann sucht, findet man z.B.:

    http://support.microsoft.com/kb/259695/en-us



  • sogar dieser code hat ein fehler beim Konvertieren ^^'
    bzw. weil er einen void* nicht in einen char* umwandeln kann 😉
    ich such mal selber



  • Sollte auch wirklich nur eine Suchhilfe sein. Ich habe diesen Code selbst nicht ausprobiert. Ich dachte halt nur, dass du da ein paar Funktionsnamen findest, die dir vielleicht weiterhelfen. 🙂



  • aaah, genial 😉
    hab mich auf eine japanische seite gewagt mit erfolg 😉
    ich denke, der code könnte anderen weiterhelfen und poste ihn mal hier.... ^^
    vielen dank nochmal!

    mfg
    wolfshuendchen

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "ComPort.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    
    #include <stdio.h>
    #include <tchar.h>
    #include <setupapi.h>
    
    #define MAX__DESC 				256
    
    void DisplayError(TCHAR * ErrorName)
    /*++
    
    Routine Description:
        Formats and displays erros in a readable format.
    Arguments:
        ErrorName - Supplies a string containing any additional comments to be printed.
    Return Value:
        None.
    --*/
    {
        DWORD Err = GetLastError();
        LPVOID lpMessageBuffer = NULL;
    
        if (FormatMessage( 
            FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
            NULL,
            Err,  
            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
            (LPTSTR) &lpMessageBuffer,  
            0,  
            NULL ))
            _tprintf(_T("%s FAILURE: %s\n"),ErrorName,(TCHAR *)lpMessageBuffer);
        else 
            _tprintf(_T("%s FAILURE: (0x%08x)\n"),ErrorName,Err);
    
        if (lpMessageBuffer) LocalFree( lpMessageBuffer ); // Free system buffer
    
        SetLastError(Err);
        return;
    }
    
    BOOL PortExists(TCHAR* szPortName)
    /*++
    Routine Description:
        This routine checks if the port name supplied is a valid one or not
    Arguments:
        szPortName - Supplies a string containing a port name (like COM1, COM2)
    Return Value:
        The function returns TRUE if it finds a match for port name,
    	otherwise it returns a FALSE.
    --*/
    {
    	TCHAR	szDevDesc[MAX__DESC];
    	BOOL	match = FALSE;
    	//	GUID const CLASS_GUID = GUID_DEVCLASS_PORTS;
    	GUID const CLASS_GUID = {0x4d36e978L, 0xe325, 0x11ce, {0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18}};
    
    	HDEVINFO hDevInfo;
    
    	hDevInfo = SetupDiGetClassDevs((LPGUID)&CLASS_GUID, NULL, NULL, DIGCF_PRESENT);
    
    	if ( INVALID_HANDLE_VALUE != hDevInfo)
    	{
    		SP_DEVINFO_DATA  devInfoElem;
    		int index = 0;
    		devInfoElem.cbSize = sizeof(SP_DEVINFO_DATA);
    
    		while ( SetupDiEnumDeviceInfo(hDevInfo, index++, &devInfoElem))
    		{
    			HKEY hKeyDev = SetupDiOpenDevRegKey(hDevInfo, &devInfoElem, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ);
    			if (INVALID_HANDLE_VALUE != hKeyDev) {
    				WORD length = sizeof(szDevDesc);
    				if(ERROR_SUCCESS == RegQueryValueEx(hKeyDev, _T("PortName"), NULL, NULL, (unsigned char*)szDevDesc, (LPDWORD)&length) ) {
    					RegCloseKey(hKeyDev);
    					printf("\t\tComparing :  %s\twith\t%s\n", szPortName, szDevDesc);
    					if (! _tcsicmp(szPortName, szDevDesc)) {
    						match = TRUE;
    						break;
    					}
    				}
    			}
    		} // while
    		SetupDiDestroyDeviceInfoList(hDevInfo);
    	}
    	return match;
    }
    
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
       //Aufrufbeispiele zum Test
       if (PortExists("COM1"))
          Memo1->Lines->Add("COM1");
       if (PortExists("COM2"))
          Memo1->Lines->Add("COM2");
       if (PortExists("COM3"))
          Memo1->Lines->Add("COM3");
       if (PortExists("COM4"))
          Memo1->Lines->Add("COM4");
       if (PortExists("COM23"))
          Memo1->Lines->Add("COM23");
    }
    //---------------------------------------------------------------------------
    


  • Kleiner Tipp: Wenn du die cpp-Tags (statt code-Tags) benutzt, dann wird im Code Syntaxhighlighting angewendet. 🙂



  • Hallo,

    for (int i = 0; i < 255; i++) {
      Device  = "com" + IntToStr(i);
      hSerial = CreateFile(Device.c_str(),GENERIC_READ | GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);
      if (hSerial == INVALID_HANDLE_VALUE) { ; } else {
         /* Port ist Aktiv */
         CloseHandle(hSerial);
         Application->ProcessMessages();
      }
    }
    

    Die Schleife kann man natürlich auch weglassen und die Ports einzeln abfragen. In einem Anderen Thread wurde gesagt dass ab Port 10 ein Präfix gesetzt werden muss, dass sollte hier im Code noch getestet werden...

    LG, Micha



  • RandomAccess85 schrieb:

    In einem Anderen Thread wurde gesagt dass ab Port 10 ein Präfix gesetzt werden muss, dass sollte hier im Code noch getestet werden...

    Das ist wohl der "\\\.\" Präfix. Den kann man sowieso immer angeben (wenn ich jetzt nicht komplett irre), also sollte man das auch. Dann braucht man sich da keine Gedanken mehr zu machen und vor allem nix zu unterscheiden.



  • hier als bestätigung, auch wenn der thread schon älter ist:
    ja, der prefix muss bei ports >9 sein und ist auch bei kleineren ok. er lautet "\.\", also in einem string z.b. "\\\.\\COM23".



  • mael15 schrieb:

    hier als bestätigung, auch wenn der thread schon älter ist:
    ja, der prefix muss bei ports >9 sein und ist auch bei kleineren ok. er lautet "\.\", also in einem string z.b. "\\\.\\COM23".

    Ahhhhh... danke! Und ich probier hier seit drei Jahren an meinem Quelltext rum und krieg den nicht zum Laufen. 😮



  • die Liste der vorhandenen Ports ist ja Klasse 😃 Ist es denn auch möglich, die Bezeichnung dieser Ports zu erhalten??? Auf meinem PC gibt es z.B.

    - Kommunikationsanschluss (COM1)
    - Bluetooth-Kommunikationsanschluss (COM5)
    - Bluetooth-Kommunikationsanschluss (COM6)
    - USB Serial Port (COM4)

    Genau diese Bezeichnung benötige ich...

    Gruß
    Torsten


Anmelden zum Antworten