<?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[Fehlersuche: serielle schnittstelle  nur auslesen]]></title><description><![CDATA[<p>Hallo1<br />
Ich weiß nicht mehr weiter, ich möchte Daten, die von einem Datenlogger an die serielle Schnittstelle gesendet werden, aufnehmen. Mein Programmcode zeigt aber wieder mal Fehler anb und ich weiß nicht wo der Haken liegt. Vielleicht kann mir ja jemand dabei helfen. Vielen Dank.<br />
Hier der Code von mir:</p>
<p>#include &lt;windows.h&gt;<br />
int main (void)<br />
{<br />
DCB dcb;<br />
DWORD iBytesReceived;<br />
int nRead;<br />
unsigned char bBuffer[1000];</p>
<p>HANDLE hCom = CreateFile (&quot;COM1&quot;, GENERIC_WRITE|GENERIC_READ, 0, NULL, OPEN_EXISTING,<br />
0, NULL);</p>
<p>dcb.DCBlength = sizeof(DCB); // Laenge des Blockes MUSS gesetzt sein!<br />
GetCommState (hCom, &amp;dcb); // COM-Einstellungen holen und aendern<br />
dcb.BaudRate = 9600; // Baudrate<br />
dcb.ByteSize = 8; // Datenbits<br />
dcb.Parity = NOPARITY; // Parität<br />
dcb.StopBits = ONESTOPBIT; // Stopbits<br />
SetCommState (hCom, &amp;dcb); // COM-Einstellungen speichern</p>
<p>nRead = 1;<br />
ReadFile (hCom, &amp;bBuffer, nRead, &amp;iBytesReceived, NULL);</p>
<p>CloseHandle (hCom); // COM1 schließen</p>
<p>return (0);<br />
}</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/103275/fehlersuche-serielle-schnittstelle-nur-auslesen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 01 May 2026 16:57:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/103275.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 06 Mar 2005 21:40:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Fehlersuche: serielle schnittstelle  nur auslesen on Sun, 06 Mar 2005 21:40:02 GMT]]></title><description><![CDATA[<p>Hallo1<br />
Ich weiß nicht mehr weiter, ich möchte Daten, die von einem Datenlogger an die serielle Schnittstelle gesendet werden, aufnehmen. Mein Programmcode zeigt aber wieder mal Fehler anb und ich weiß nicht wo der Haken liegt. Vielleicht kann mir ja jemand dabei helfen. Vielen Dank.<br />
Hier der Code von mir:</p>
<p>#include &lt;windows.h&gt;<br />
int main (void)<br />
{<br />
DCB dcb;<br />
DWORD iBytesReceived;<br />
int nRead;<br />
unsigned char bBuffer[1000];</p>
<p>HANDLE hCom = CreateFile (&quot;COM1&quot;, GENERIC_WRITE|GENERIC_READ, 0, NULL, OPEN_EXISTING,<br />
0, NULL);</p>
<p>dcb.DCBlength = sizeof(DCB); // Laenge des Blockes MUSS gesetzt sein!<br />
GetCommState (hCom, &amp;dcb); // COM-Einstellungen holen und aendern<br />
dcb.BaudRate = 9600; // Baudrate<br />
dcb.ByteSize = 8; // Datenbits<br />
dcb.Parity = NOPARITY; // Parität<br />
dcb.StopBits = ONESTOPBIT; // Stopbits<br />
SetCommState (hCom, &amp;dcb); // COM-Einstellungen speichern</p>
<p>nRead = 1;<br />
ReadFile (hCom, &amp;bBuffer, nRead, &amp;iBytesReceived, NULL);</p>
<p>CloseHandle (hCom); // COM1 schließen</p>
<p>return (0);<br />
}</p>
]]></description><link>https://www.c-plusplus.net/forum/post/739125</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/739125</guid><dc:creator><![CDATA[portfan]]></dc:creator><pubDate>Sun, 06 Mar 2005 21:40:02 GMT</pubDate></item><item><title><![CDATA[Reply to Fehlersuche: serielle schnittstelle  nur auslesen on Sun, 06 Mar 2005 22:06:23 GMT]]></title><description><![CDATA[<p>Benutze bitte die C++ Tags, damit man deinen Code auch lesen kann.</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;
int main (void)
{
DCB dcb;
DWORD iBytesReceived;
int nRead;
unsigned char bBuffer[1000];

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

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

nRead = 1;
ReadFile (hCom, &amp;bBuffer, nRead, &amp;iBytesReceived, NULL);

CloseHandle (hCom); // COM1 schließen

return (0);
}
</code></pre>
<p>Schon viel besser, gell?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/739155</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/739155</guid><dc:creator><![CDATA[shareholder]]></dc:creator><pubDate>Sun, 06 Mar 2005 22:06:23 GMT</pubDate></item><item><title><![CDATA[Reply to Fehlersuche: serielle schnittstelle  nur auslesen on Mon, 07 Mar 2005 06:22:15 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/8415">@portfan</a>,</p>
<p>dieses Code-Schnipsel war nur fürs Senden geeignet, einfach WriteFile durch ReadFile (und die paar Parameter) ersetzten, geht nicht. Senden geht ja zu jedem Zeitpunkt, beim Empfangen muß man WARTEN. Du wartest nicht, sondern versuchst, ein Zeichen auszulesen und beendest das Programm. Hier ist das passende Empfangsprogramm zu dem von Dir veränderten Beispiel:</p>
<pre><code class="language-cpp">// DOS32-Programm zum Senden/Empfangen von Bytes über COM (9600-8N1)
// Alle empfangenen Bytes werden zurückgesendet.
// OS: W95, W98, W98SE, WinME, WinNT, Win2000, WinXP
// Note: Keine Fehlerbehandlung implementiert!
#include &lt;windows.h&gt;
#include &lt;stdio.h&gt;

#define COM_BUFFER_SIZE 256       // Read- und Write-Buffer-Size
#define BD_RATE         CBR_9600 // 9600 Baud
#define HELP_STRING TEXT(&quot;Aufruf mit: progname &lt;COM-Port-Nummer&gt;\r\n&quot;)

// Hauptprogramm: Aufruf mit: progname &lt;COM-Port-Nummer&gt;
int main (int argc, char **argv)
{
	DCB           dcb;    
	DWORD         iBytesWritten;
	BOOL          bRet      = true;
	DWORD         dwRead    = 0;
	DWORD         dwSetMask = EV_RXCHAR | EV_ERR; 
	DWORD         dwEvtMask; 
	OVERLAPPED    o;
	COMMTIMEOUTS  ct;
	unsigned char InString[COM_BUFFER_SIZE + 1];
	TCHAR         szCOM[6];

	if (argc == 2 &amp;&amp;                              // progname + COM-Port-Nummer ?
		  atoi (argv[1]) &gt; 0 &amp;&amp; atoi (argv[1]) &lt; 5) // COM1 ... COM4?
		wsprintf (szCOM, TEXT(&quot;COM%s&quot;), argv[1]);   // String &quot;basteln&quot; ...
	else
	{ 
		printf (TEXT(&quot;\r\nERROR:\t %s&quot;), HELP_STRING);
		return (1); // und tschüß ...
	}

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

	HANDLE hCom = CreateFile (szCOM, GENERIC_WRITE | GENERIC_READ, 0, NULL, 
		                        OPEN_EXISTING, 0, NULL);                     

	if (hCom == INVALID_HANDLE_VALUE)
	{ // Fehlerausgabe:
		LPVOID lpMsgBuf;
		FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | 
										FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(),
										MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &amp;lpMsgBuf, 0, NULL);
		MessageBox (NULL, (LPCTSTR)lpMsgBuf, &quot;Error: CreateFile&quot;, MB_OK | MB_ICONINFORMATION);
		LocalFree (lpMsgBuf);
		return (1); // und tschüß ...
	}

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

	GetCommTimeouts (hCom, &amp;ct);
	// Warte-Zeit [ms] vom Beginn eines Bytes bis zum Beginn des nächsten Bytes 
	ct.ReadIntervalTimeout         = 1000 / BD_RATE * (dcb.ByteSize + 
		                                                 (dcb.Parity == NOPARITY ? 0 : 1) + 
																										 (dcb.StopBits == ONESTOPBIT ? 1 : 2)) * 2;
	ct.ReadTotalTimeoutMultiplier  = 0;  // [ms] wird mit Read-Buffer-Size multipliziert
	ct.ReadTotalTimeoutConstant    = 50; // wird an ReadTotalTimeoutMultiplier angehängt
	ct.WriteTotalTimeoutMultiplier = 0;
	ct.WriteTotalTimeoutConstant   = 0;
	SetCommTimeouts (hCom, &amp;ct);

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

	do  // in Endlos-Schleife auf Empfangssignale warten:
	{
		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:
					LPVOID lpMsgBuf;
					FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | 
													FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(),
													MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
													(LPTSTR) &amp;lpMsgBuf, 0, NULL);
					MessageBox (NULL, (LPCTSTR)lpMsgBuf, &quot;Error: ReadFile&quot;, 
											MB_OK | MB_ICONINFORMATION);
					LocalFree (lpMsgBuf);
				}
				else
				{ // Ausgabe (oder Verarbeitung) der empfangenen Bytes:
					InString[dwRead] = '\0'; // in &quot;zero-ended&quot;-String verwandeln
					printf (TEXT(&quot;\r\n\tRxD (%d Byte(s)): %s&quot;), dwRead, InString);
					WriteFile (hCom, &amp;InString, dwRead, &amp;iBytesWritten, NULL); // Senden der Bytes
				}
			}

			if (dwEvtMask &amp; EV_ERR) 
			{
				MessageBox (NULL, &quot;Error empfangen&quot;, &quot;Error: ReadFile&quot;, MB_OK);
				break; // Schleifen-Abbruch
			}
		}
	}
	while (1);

	CloseHandle (hCom);     // COM schließen
	CloseHandle (o.hEvent); // Event-Handle zurückgeben

	return (0);
}
</code></pre>
<p>Das Zurücksenden kannst Du ja durch Speichern o.ä. ersetzten.</p>
<p>Blackbird</p>
<p>PS: Marc++us, was ist denn mit den Userdaten passiert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/739203</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/739203</guid><dc:creator><![CDATA[Blackbird (kann sich nich]]></dc:creator><pubDate>Mon, 07 Mar 2005 06:22:15 GMT</pubDate></item><item><title><![CDATA[Reply to Fehlersuche: serielle schnittstelle  nur auslesen on Mon, 07 Mar 2005 09:15:11 GMT]]></title><description><![CDATA[<p>Danke erst mal für die Fehlerbeseitigungen!<br />
Aber wie wird es gemacht, damit sich kein DOS-Fenster öffnet, sondern ein Windows-Fenster, wo dann die eingelesenen Werte dastehen? Da bin ich total unkundig drin. Ich weiß, dass wenn ich eine WIN32-Anwendung erstelle und dort die Einstellung &quot;MFC in einer gemeinsam genutzten DLL verwenden&quot; vornehme, dann die Windows-Fenster erzeugen kann, aber dann hört es auch schon auf.</p>
<p>mfg portfan (oder auch nicht fan)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/739293</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/739293</guid><dc:creator><![CDATA[portfan]]></dc:creator><pubDate>Mon, 07 Mar 2005 09:15:11 GMT</pubDate></item><item><title><![CDATA[Reply to Fehlersuche: serielle schnittstelle  nur auslesen on Mon, 07 Mar 2005 10:17:27 GMT]]></title><description><![CDATA[<p>MFC? Dann wäre das hier das falsche Board.<br />
Außerdem ist das ja in Deiner Eingangsfrage so nicht rauszulesen gewesen.</p>
<p>Mit VC++6.0:<br />
- einfach ein Projekt mit &quot;WIN32_Anwendung&quot; erstellen,<br />
- eine WinMain-Funktion einbauen, die eine Callback-Funktion hat,<br />
- die Callback-Funktion schreiben,<br />
- ein Edit-Fenster erstellen,<br />
- einen COM-Read-Thread schreiben und alle Zeichen an das Edit-Fenster senden.</p>
<p>In der MSDN gibt es zu allen schon Beispiele, kombinieren mußt Du es dann so, wie Du es brauchst.</p>
<p>Aber das hat fast alles nichts mit serieller Communications zu tun.</p>
<p>Blackbird</p>
]]></description><link>https://www.c-plusplus.net/forum/post/739334</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/739334</guid><dc:creator><![CDATA[Blackbird]]></dc:creator><pubDate>Mon, 07 Mar 2005 10:17:27 GMT</pubDate></item></channel></rss>