<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Bestimmtes Gerät an COM-Ports finden]]></title><description><![CDATA[<p>Servus,</p>
<p>ich hab hier einen µC mit dem ich gern Daten über die serielle Schnittstelle austauschen möchte - das klappt auch soweit bestens.</p>
<p>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?</p>
<p>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?</p>
<p>Hier noch mein Code, mit dem ich das Gerät bisher anspreche:</p>
<pre><code class="language-cpp">#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__
</code></pre>
<pre><code class="language-cpp">#include &quot;stdafx.h&quot;

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&quot;COM5&quot;, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

	if(DeviceHandle == INVALID_HANDLE_VALUE) 
	{
		ErrorMessage = &quot;Port konnte nicht geöffnet werden.&quot;;
		CloseHandle(DeviceHandle);
		return 1;
	}

	// set timeouts
	COMMTIMEOUTS Timeout = { 1, 100, 1000, 0, 0 };

	if(!SetCommTimeouts(DeviceHandle, &amp;Timeout))
	{
		ErrorMessage = &quot;Timeout konnte nicht festgelegt werden.&quot;;
		CloseHandle(DeviceHandle);
		return 1;
	}

	// set Port
	memset(&amp;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, &amp;Port))
	{
		ErrorMessage = &quot;Port konnte nicht konfiguriert werden&quot;;
		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
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/239041/bestimmtes-gerät-an-com-ports-finden</link><generator>RSS for Node</generator><lastBuildDate>Tue, 22 Sep 2026 00:03:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/239041.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 18 Apr 2009 16:07:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Bestimmtes Gerät an COM-Ports finden on Sat, 18 Apr 2009 16:07:16 GMT]]></title><description><![CDATA[<p>Servus,</p>
<p>ich hab hier einen µC mit dem ich gern Daten über die serielle Schnittstelle austauschen möchte - das klappt auch soweit bestens.</p>
<p>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?</p>
<p>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?</p>
<p>Hier noch mein Code, mit dem ich das Gerät bisher anspreche:</p>
<pre><code class="language-cpp">#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__
</code></pre>
<pre><code class="language-cpp">#include &quot;stdafx.h&quot;

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&quot;COM5&quot;, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

	if(DeviceHandle == INVALID_HANDLE_VALUE) 
	{
		ErrorMessage = &quot;Port konnte nicht geöffnet werden.&quot;;
		CloseHandle(DeviceHandle);
		return 1;
	}

	// set timeouts
	COMMTIMEOUTS Timeout = { 1, 100, 1000, 0, 0 };

	if(!SetCommTimeouts(DeviceHandle, &amp;Timeout))
	{
		ErrorMessage = &quot;Timeout konnte nicht festgelegt werden.&quot;;
		CloseHandle(DeviceHandle);
		return 1;
	}

	// set Port
	memset(&amp;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, &amp;Port))
	{
		ErrorMessage = &quot;Port konnte nicht konfiguriert werden&quot;;
		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
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1697838</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1697838</guid><dc:creator><![CDATA[Schnapphase]]></dc:creator><pubDate>Sat, 18 Apr 2009 16:07:16 GMT</pubDate></item><item><title><![CDATA[Reply to Bestimmtes Gerät an COM-Ports finden on Sat, 18 Apr 2009 16:17:10 GMT]]></title><description><![CDATA[<p>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.</p>
<p>Aber ich würde eigentlich schon vermuten, dass es solche Möglichkeiten gibt. Einfach mal in der MSDN suchen gehen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1697845</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1697845</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 18 Apr 2009 16:17:10 GMT</pubDate></item><item><title><![CDATA[Reply to Bestimmtes Gerät an COM-Ports finden on Sat, 18 Apr 2009 21:46:48 GMT]]></title><description><![CDATA[<p>&gt; Das ist WinAPI Ktram</p>
<p>Oh das ist wahr, ich verschiebe mal in ein passenderes Forum.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1697957</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1697957</guid><dc:creator><![CDATA[schnapphase]]></dc:creator><pubDate>Sat, 18 Apr 2009 21:46:48 GMT</pubDate></item><item><title><![CDATA[Reply to Bestimmtes Gerät an COM-Ports finden on Thu, 07 May 2009 13:21:39 GMT]]></title><description><![CDATA[<p>Schnapphase schrieb:</p>
<blockquote>
<p>void Serial_Device :: Read(unsigned char* Buf, DWORD* BufLen)<br />
{<br />
ReadFile(DeviceHandle, Buf, <strong>sizeof(Buf)</strong>, BufLen, NULL); // read is updated with the number of bytes read<br />
}<br />
[/cpp]</p>
</blockquote>
<p>Also ich verallgemeinere ja nicht gerne, aber:<br />
Schau dir das bitte noch einmal an, und danach <a href="http://openbook.galileocomputing.de/c_von_a_bis_z/" rel="nofollow">das hier</a>, das wird dir helfen - ich sehe da so einiges an Missverständnis in Bezug auf die Programmierung unter C++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1707149</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1707149</guid><dc:creator><![CDATA[Benutzername_belegt]]></dc:creator><pubDate>Thu, 07 May 2009 13:21:39 GMT</pubDate></item></channel></rss>