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.html

    Lasse 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


Anmelden zum Antworten