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 }
-
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++