Bestimmtes Gerät an COM-Ports finden



  • Servus,

    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
    }
    

  • Administrator

    Dir ist bewusst, dass Standard C++ keine Ahnung hat, was ein COM Port, eine serielle Schnittstelle oder USB ist? Oder anders gesagt, du bist im falschen Forum, dass ist WinAPI Kram und gehört daher in das eigene Unterforum dafür.

    Aber ich würde eigentlich schon vermuten, dass es solche Möglichkeiten gibt. Einfach mal in der MSDN suchen gehen 😉

    Grüssli



  • > Das ist WinAPI Ktram

    Oh das ist wahr, ich verschiebe mal in ein passenderes Forum.



  • Schnapphase schrieb:

    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
    }
    [/cpp]

    Also ich verallgemeinere ja nicht gerne, aber:
    Schau dir das bitte noch einmal an, und danach das hier, das wird dir helfen - ich sehe da so einiges an Missverständnis in Bezug auf die Programmierung unter C++


Anmelden zum Antworten