<?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[RS-232 Daten senden und empfangen]]></title><description><![CDATA[<p>Hallo,</p>
<p>bin in C++ relativ unerfahren. Und hab auch gesehen, dass es schon ein paar Artikel zu dem Thema gibt. Die haben mir aber leider nicht sehr weitergeholfen.<br />
Versuche die Kommunikation zwischen einem Endgerät und meinem PC hin zu bekommen. Das Problem ist allerdings, das die Kommunikation zwischen den beiden Geräten zufällig abläuft. D.h.: mal sendet das Gerät an den PC, mal andersrum, allerdings nicht zwingend abwechselnd.</p>
<p>Ich hab die Kommunikation bisher in die eine ODER die andere Richtung hingekriegt. Wie realisiere ich jetzt allerdings, dass Signale die zum PC kommen registriert werden, ohne das die RS232 permanent ausgelesen wird? Art Interrupts sind ja unter c++ nicht möglich. Hab was über Threads gelesen, kam da aber auch nicht weiter.</p>
<p>Mein Code sieht zum einlesen bisher wie folgt aus:</p>
<pre><code class="language-cpp">WaitCommEvent (hCom, &amp;dwEvtMask, &amp;o); // Event mit Empfangssignalen verknüpfen

	if (WAIT_OBJECT_0 == WaitForSingleObject (o.hEvent, INFINITE)) // warten bis Event
		{
		 if (dwEvtMask &amp; EV_RXCHAR) // Zeichen an RxD empfangen:
			{
			 bRet = ReadFile (hCom, &amp;InString, sizeof (InString), &amp;dwRead, NULL);

						if (!bRet)
							{ // Fehlerausgabe:
							   cout&lt;&lt;&quot;Fehler aufgetreten!&quot;&lt;&lt;endl;
							}
						else
							{ // Ausgabe (oder Verarbeitung) der empfangenen Bytes:
								InString[dwRead] = '\0';
								printf (TEXT(&quot;\r\n\tRxD (%d Byte(s)): %s&quot;), dwRead, InString);
								WriteFile (hCom, &amp;InString, dwRead, &amp;iBytesWritten, &amp;o); // Senden eines Bytes
								cout&lt;&lt;&quot;Folgenden Text empfangen: &quot;&lt;&lt;InString[1]&lt;&lt;endl;
							}
						}
				}
</code></pre>
<p>Zum auslesen:</p>
<pre><code class="language-cpp">cout&lt;&lt;&quot;Was soll gesendet werden?&quot;&lt;&lt;endl;
		cin&gt;&gt;Buchstabe;
		int String[1] = {Buchstabe};
		WriteFile (hCom, &amp;String, 1, &amp;iBytesWritten, &amp;o); // Senden eines Bytes
</code></pre>
<p>Initialiseren tu ich das ganze wie folgt:</p>
<pre><code class="language-cpp">DCB dcb;
	DWORD			iBytesWritten;
	BOOL			bRet      = true;
	DWORD			dwRead    = 0;
	DWORD			dwSetMask = EV_RXCHAR | EV_ERR;
	DWORD			dwEvtMask;
	OVERLAPPED		o;
	float			Entscheider;
	unsigned char	InString[COM_BUFFER_SIZE + 1];
	char			Buchstabe;
	float			i;

	memset (&amp;o, 0, sizeof (OVERLAPPED)); // Struktur mit 0en füllen
	o.hEvent = CreateEvent (NULL, FALSE, FALSE, NULL); // einen Event setzten

	HANDLE hCom = CreateFile (&quot;COM2&quot;, GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, &amp;o);                     

	dcb.DCBlength = sizeof(DCB);  // Laenge des Blockes MUSS gesetzt sein!
	GetCommState (hCom, &amp;dcb);    // COM-Einstellungen holen und aendern
	dcb.BaudRate  = 9600;      // Baudrate
	dcb.ByteSize  = 8;            // Datenbits
	dcb.Parity    = NOPARITY;     // Parität
	dcb.StopBits  = ONESTOPBIT;   // Stopbits
	SetCommState (hCom, &amp;dcb);    // COM-Einstellungen speichern

	// Zwischenspeicher des serial-Drivers einstellen (für read und write):
	SetupComm (hCom, COM_BUFFER_SIZE, COM_BUFFER_SIZE);

	SetCommMask (hCom, dwSetMask); // Empfangssignale definieren
</code></pre>
<p>Vielen Dank<br />
Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/150838/rs-232-daten-senden-und-empfangen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 22 Jul 2026 16:19:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/150838.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 20 Jun 2006 17:49:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to RS-232 Daten senden und empfangen on Tue, 20 Jun 2006 17:49:27 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>bin in C++ relativ unerfahren. Und hab auch gesehen, dass es schon ein paar Artikel zu dem Thema gibt. Die haben mir aber leider nicht sehr weitergeholfen.<br />
Versuche die Kommunikation zwischen einem Endgerät und meinem PC hin zu bekommen. Das Problem ist allerdings, das die Kommunikation zwischen den beiden Geräten zufällig abläuft. D.h.: mal sendet das Gerät an den PC, mal andersrum, allerdings nicht zwingend abwechselnd.</p>
<p>Ich hab die Kommunikation bisher in die eine ODER die andere Richtung hingekriegt. Wie realisiere ich jetzt allerdings, dass Signale die zum PC kommen registriert werden, ohne das die RS232 permanent ausgelesen wird? Art Interrupts sind ja unter c++ nicht möglich. Hab was über Threads gelesen, kam da aber auch nicht weiter.</p>
<p>Mein Code sieht zum einlesen bisher wie folgt aus:</p>
<pre><code class="language-cpp">WaitCommEvent (hCom, &amp;dwEvtMask, &amp;o); // Event mit Empfangssignalen verknüpfen

	if (WAIT_OBJECT_0 == WaitForSingleObject (o.hEvent, INFINITE)) // warten bis Event
		{
		 if (dwEvtMask &amp; EV_RXCHAR) // Zeichen an RxD empfangen:
			{
			 bRet = ReadFile (hCom, &amp;InString, sizeof (InString), &amp;dwRead, NULL);

						if (!bRet)
							{ // Fehlerausgabe:
							   cout&lt;&lt;&quot;Fehler aufgetreten!&quot;&lt;&lt;endl;
							}
						else
							{ // Ausgabe (oder Verarbeitung) der empfangenen Bytes:
								InString[dwRead] = '\0';
								printf (TEXT(&quot;\r\n\tRxD (%d Byte(s)): %s&quot;), dwRead, InString);
								WriteFile (hCom, &amp;InString, dwRead, &amp;iBytesWritten, &amp;o); // Senden eines Bytes
								cout&lt;&lt;&quot;Folgenden Text empfangen: &quot;&lt;&lt;InString[1]&lt;&lt;endl;
							}
						}
				}
</code></pre>
<p>Zum auslesen:</p>
<pre><code class="language-cpp">cout&lt;&lt;&quot;Was soll gesendet werden?&quot;&lt;&lt;endl;
		cin&gt;&gt;Buchstabe;
		int String[1] = {Buchstabe};
		WriteFile (hCom, &amp;String, 1, &amp;iBytesWritten, &amp;o); // Senden eines Bytes
</code></pre>
<p>Initialiseren tu ich das ganze wie folgt:</p>
<pre><code class="language-cpp">DCB dcb;
	DWORD			iBytesWritten;
	BOOL			bRet      = true;
	DWORD			dwRead    = 0;
	DWORD			dwSetMask = EV_RXCHAR | EV_ERR;
	DWORD			dwEvtMask;
	OVERLAPPED		o;
	float			Entscheider;
	unsigned char	InString[COM_BUFFER_SIZE + 1];
	char			Buchstabe;
	float			i;

	memset (&amp;o, 0, sizeof (OVERLAPPED)); // Struktur mit 0en füllen
	o.hEvent = CreateEvent (NULL, FALSE, FALSE, NULL); // einen Event setzten

	HANDLE hCom = CreateFile (&quot;COM2&quot;, GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, &amp;o);                     

	dcb.DCBlength = sizeof(DCB);  // Laenge des Blockes MUSS gesetzt sein!
	GetCommState (hCom, &amp;dcb);    // COM-Einstellungen holen und aendern
	dcb.BaudRate  = 9600;      // Baudrate
	dcb.ByteSize  = 8;            // Datenbits
	dcb.Parity    = NOPARITY;     // Parität
	dcb.StopBits  = ONESTOPBIT;   // Stopbits
	SetCommState (hCom, &amp;dcb);    // COM-Einstellungen speichern

	// Zwischenspeicher des serial-Drivers einstellen (für read und write):
	SetupComm (hCom, COM_BUFFER_SIZE, COM_BUFFER_SIZE);

	SetCommMask (hCom, dwSetMask); // Empfangssignale definieren
</code></pre>
<p>Vielen Dank<br />
Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1081576</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1081576</guid><dc:creator><![CDATA[God_of_Hellfire]]></dc:creator><pubDate>Tue, 20 Jun 2006 17:49:27 GMT</pubDate></item><item><title><![CDATA[Reply to RS-232 Daten senden und empfangen on Wed, 21 Jun 2006 05:55:09 GMT]]></title><description><![CDATA[<p>Auf <a href="http://www.codeproject.com" rel="nofollow">www.codeproject.com</a> findest Du eine Klasse CSerial oder auch CSerialMFC. Die bindest Du in Dein Projekt ein. Es gibt hier schon einige Threads dazu. Wenn Du was an das Gerät senden willst so gibt es dafür eine Funktion, sendet Dein Gerät etwas an den Rechner wird eine Windows-Nachricht generiert, auf die Du dann in einer Nachrichtenbehandlungsroutine reagieren kannst. Du brauchst Dich da nicht auf ein permanentes Abfragen der Schnittstelle zu konzentrieren, auch der zusätzliche Thread wird von dieser Klasse gekapselt. Wenn Du nicht weiter kommst melde Dich einfach.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1081771</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1081771</guid><dc:creator><![CDATA[AndyDD]]></dc:creator><pubDate>Wed, 21 Jun 2006 05:55:09 GMT</pubDate></item><item><title><![CDATA[Reply to RS-232 Daten senden und empfangen on Wed, 21 Jun 2006 06:53:21 GMT]]></title><description><![CDATA[<p>Du brauchst einen eigenen Thread um die Daten zu empfangen.<br />
Ich empfehle (mal wieder) die Verwendung einer fertigen Klasse, da die serielle Kommunikation wirklich nicht trivial ist (wie Du ja selber festgestellt hast):<br />
<a href="http://www.codeproject.com/system/serial.asp" rel="nofollow">http://www.codeproject.com/system/serial.asp</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1081794</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1081794</guid><dc:creator><![CDATA[Jochen Kalmbach]]></dc:creator><pubDate>Wed, 21 Jun 2006 06:53:21 GMT</pubDate></item></channel></rss>