<?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[ReadFile langsam? Buffer überlauf? Woran liegts?]]></title><description><![CDATA[<p>Hi,</p>
<p>ich lese Daten, von einem Microcontroller gesendet, über den Comport aus.</p>
<p>Dazu warte ich auf die Endkennung des Datenpakets mittels WaitForSingleObject() und lese die Daten dann mit ReadFile ein. Da ich die genaue Paketgröße kenne ist das alles kein Problem.</p>
<p>Falls dennoch ein Fehler eintrifft, wird per polling mittels ReadFile die Anfangskennung gesucht und dann wieder die kompletten Pakete eingelesen.</p>
<p>In der Theorie finde ich hört sich das ganz gut an, jedoch passiert so ein &quot;Fehler&quot; relativ oft... so ungefähr 30 mal in der Minute.</p>
<p>Woran liegt das? Wenn ich mir die Daten in einem Terminal anschaue sind absolut keine Fehler zu sehen!<br />
Ist an meinem Programm ablauf etwas falsch?</p>
<p>Thread zum warten auf Event char</p>
<pre><code>waitflag = true;
	firstrun = true;
	DWORD dwRes;
	DWORD dwEvtMask = NULL;
	OVERLAPPED over = {0};
	memset(&amp;over, 0, sizeof(over));
	over.hEvent = CreateEvent (NULL, FALSE, FALSE, NULL);
	/// Schleife bis der Thread beendet wird
	while(!Terminated){
	  try{
		if (hComm != INVALID_HANDLE_VALUE){
			if (!waitflag) {
				WaitCommEvent(hComm, &amp;dwEvtMask, &amp;over);
				/// warten auf Endkennung 0xFE
				dwRes = WaitForSingleObject(over.hEvent, 500);
				switch (dwRes){
					case WAIT_OBJECT_0 :
						///Event aufgetreten
						if (dwEvtMask == EV_RXFLAG){
							/// Daten holen
							empfangen();
							/// Daten ans Display weiterleiten
							MainForm-&gt;display(readdata);
						}
						break;
					case WAIT_TIMEOUT :
						// TimeOut -&gt; nichts tun und weiter warten
						break;
					default : break;
				}
			}
		}
		/// readdata kann mit strg+z angezeigt werden
		MainForm-&gt;Edit2-&gt;Text = readdata;
		}catch(...){}
	}
	shutdownCom();
</code></pre>
<p>Daten einlesen und Fehler handling</p>
<pre><code>OVERLAPPED ovread = {0};
	ovread.hEvent = CreateEvent (NULL, FALSE, FALSE, NULL);
	DWORD dwBytesRead = 0;
	/// Bei erstem Lauf nach Startkennung suchen
	if (firstrun) {
		u8 read1[1];
		read1[0] = 0;
		/// Solange bis Startkennung gefunden und Thread und Comport nicht beendet werden
		while (read1[0] != 0xFF &amp;&amp; !Terminated &amp;&amp; hComm != INVALID_HANDLE_VALUE) {
			ReadFile(hComm, read1, 1 , &amp;dwBytesRead, &amp;ovread);
			while(!GetOverlappedResult(hComm,&amp;ovread,&amp;dwBytesRead,false) &amp;&amp; !Terminated &amp;&amp; hComm != INVALID_HANDLE_VALUE){
				// warten
			}
		}
	}
	/// Auslesen der Daten
	u8 read[100];
	ReadFile(hComm, read, bytestoread+2 , &amp;dwBytesRead, &amp;ovread);
	while(!GetOverlappedResult(hComm,&amp;ovread,&amp;dwBytesRead,false) &amp;&amp; !Terminated &amp;&amp; hComm != INVALID_HANDLE_VALUE){
		// warten
	}
	firstrun = false;
	/// Startkennung noch vorhanden? Wenn nicht -&gt; Firstrun
	if (read[bytestoread+1]!= 0xFF) {
		firstrun=true;
	}
	/// Wenn kein Firstrun -&gt; Daten zwischenspeichern zum Anzeigen
	if (!firstrun) {
		readdata = &quot;&quot;;
		for (int i = 0;i &lt; bytestoread+2 ;i++ ) {

			readdata += (char)read[i];
		}
	}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/192271/readfile-langsam-buffer-überlauf-woran-liegts</link><generator>RSS for Node</generator><lastBuildDate>Wed, 01 Jul 2026 00:32:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/192271.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 12 Sep 2007 12:56:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to ReadFile langsam? Buffer überlauf? Woran liegts? on Wed, 12 Sep 2007 12:56:59 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich lese Daten, von einem Microcontroller gesendet, über den Comport aus.</p>
<p>Dazu warte ich auf die Endkennung des Datenpakets mittels WaitForSingleObject() und lese die Daten dann mit ReadFile ein. Da ich die genaue Paketgröße kenne ist das alles kein Problem.</p>
<p>Falls dennoch ein Fehler eintrifft, wird per polling mittels ReadFile die Anfangskennung gesucht und dann wieder die kompletten Pakete eingelesen.</p>
<p>In der Theorie finde ich hört sich das ganz gut an, jedoch passiert so ein &quot;Fehler&quot; relativ oft... so ungefähr 30 mal in der Minute.</p>
<p>Woran liegt das? Wenn ich mir die Daten in einem Terminal anschaue sind absolut keine Fehler zu sehen!<br />
Ist an meinem Programm ablauf etwas falsch?</p>
<p>Thread zum warten auf Event char</p>
<pre><code>waitflag = true;
	firstrun = true;
	DWORD dwRes;
	DWORD dwEvtMask = NULL;
	OVERLAPPED over = {0};
	memset(&amp;over, 0, sizeof(over));
	over.hEvent = CreateEvent (NULL, FALSE, FALSE, NULL);
	/// Schleife bis der Thread beendet wird
	while(!Terminated){
	  try{
		if (hComm != INVALID_HANDLE_VALUE){
			if (!waitflag) {
				WaitCommEvent(hComm, &amp;dwEvtMask, &amp;over);
				/// warten auf Endkennung 0xFE
				dwRes = WaitForSingleObject(over.hEvent, 500);
				switch (dwRes){
					case WAIT_OBJECT_0 :
						///Event aufgetreten
						if (dwEvtMask == EV_RXFLAG){
							/// Daten holen
							empfangen();
							/// Daten ans Display weiterleiten
							MainForm-&gt;display(readdata);
						}
						break;
					case WAIT_TIMEOUT :
						// TimeOut -&gt; nichts tun und weiter warten
						break;
					default : break;
				}
			}
		}
		/// readdata kann mit strg+z angezeigt werden
		MainForm-&gt;Edit2-&gt;Text = readdata;
		}catch(...){}
	}
	shutdownCom();
</code></pre>
<p>Daten einlesen und Fehler handling</p>
<pre><code>OVERLAPPED ovread = {0};
	ovread.hEvent = CreateEvent (NULL, FALSE, FALSE, NULL);
	DWORD dwBytesRead = 0;
	/// Bei erstem Lauf nach Startkennung suchen
	if (firstrun) {
		u8 read1[1];
		read1[0] = 0;
		/// Solange bis Startkennung gefunden und Thread und Comport nicht beendet werden
		while (read1[0] != 0xFF &amp;&amp; !Terminated &amp;&amp; hComm != INVALID_HANDLE_VALUE) {
			ReadFile(hComm, read1, 1 , &amp;dwBytesRead, &amp;ovread);
			while(!GetOverlappedResult(hComm,&amp;ovread,&amp;dwBytesRead,false) &amp;&amp; !Terminated &amp;&amp; hComm != INVALID_HANDLE_VALUE){
				// warten
			}
		}
	}
	/// Auslesen der Daten
	u8 read[100];
	ReadFile(hComm, read, bytestoread+2 , &amp;dwBytesRead, &amp;ovread);
	while(!GetOverlappedResult(hComm,&amp;ovread,&amp;dwBytesRead,false) &amp;&amp; !Terminated &amp;&amp; hComm != INVALID_HANDLE_VALUE){
		// warten
	}
	firstrun = false;
	/// Startkennung noch vorhanden? Wenn nicht -&gt; Firstrun
	if (read[bytestoread+1]!= 0xFF) {
		firstrun=true;
	}
	/// Wenn kein Firstrun -&gt; Daten zwischenspeichern zum Anzeigen
	if (!firstrun) {
		readdata = &quot;&quot;;
		for (int i = 0;i &lt; bytestoread+2 ;i++ ) {

			readdata += (char)read[i];
		}
	}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1363998</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1363998</guid><dc:creator><![CDATA[neffetS]]></dc:creator><pubDate>Wed, 12 Sep 2007 12:56:59 GMT</pubDate></item><item><title><![CDATA[Reply to ReadFile langsam? Buffer überlauf? Woran liegts? on Wed, 12 Sep 2007 13:01:48 GMT]]></title><description><![CDATA[<p>hör mal auf so frickligen code zu schreiben</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364003</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364003</guid><dc:creator><![CDATA[tenschou]]></dc:creator><pubDate>Wed, 12 Sep 2007 13:01:48 GMT</pubDate></item><item><title><![CDATA[Reply to ReadFile langsam? Buffer überlauf? Woran liegts? on Wed, 12 Sep 2007 13:02:44 GMT]]></title><description><![CDATA[<p>danke bringt mich weiter....</p>
<p>und was bitte soll daran fricklig sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364006</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364006</guid><dc:creator><![CDATA[neffetS]]></dc:creator><pubDate>Wed, 12 Sep 2007 13:02:44 GMT</pubDate></item><item><title><![CDATA[Reply to ReadFile langsam? Buffer überlauf? Woran liegts? on Wed, 12 Sep 2007 17:28:21 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">waitflag = true; 
firstrun = true; 
DWORD dwRes; 
DWORD dwEvtMask = 0; 
OVERLAPPED over = { 0 }; 

memset(&amp;over, 0, sizeof(over)); 
over.hEvent = CreateEvent(0, false, false, 0); 

while(!Terminated)
{
	try
	{
		if(hComm != INVALID_HANDLE_VALUE)
		{
			if(!waitflag)
			{
				WaitCommEvent(hComm, &amp;dwEvtMask, &amp;over);
				dwRes = WaitForSingleObject(over.hEvent, 500);

				switch dwRes)
				{
				case WAIT_OBJECT_0:
					if(dwEvtMask == EV_RXFLAG)
					{
                        empfangen();
                        MainForm-&gt;display(readdata);
                    }
                    break;
                case WAIT_TIMEOUT:
                    break;
                default:
					break;
				}
			}
		}

		MainForm-&gt;Edit2-&gt;Text = readdata;
	}
	catch(...) { ; }
}

shutdownCom();
</code></pre>
<pre><code class="language-cpp">OVERLAPPED ovread = { 0 };
ovread.hEvent = CreateEvent(0, false, false, 0);
DWORD dwBytesRead = 0;

if(firstrun)
{
	u8 read1[1];
	read1[0] = 0;

	while(read1[0] != 0xFF &amp;&amp; !Terminated &amp;&amp; hComm != INVALID_HANDLE_VALUE)
	{
		ReadFile(hComm, read1, 1 , &amp;dwBytesRead, &amp;ovread);

		while(!GetOverlappedResult(hComm, &amp;ovread, &amp;dwBytesRead, false) &amp;&amp; !Terminated &amp;&amp; hComm != INVALID_HANDLE_VALUE) { ; } 
	} 
} 

u8 read[100];
ReadFile(hComm, read, bytestoread + 2 , &amp;dwBytesRead, &amp;ovread);

while(!GetOverlappedResult(hComm, &amp;ovread, &amp;dwBytesRead, false) &amp;&amp; !Terminated &amp;&amp; hComm != INVALID_HANDLE_VALUE) { ; }

firstrun = false;

if(read[bytestoread + 1] != 0xFF)
	firstrun = true;

if(!firstrun)
{
	readdata = &quot;&quot;;

	for(int i = 0; i &lt; bytestoread + 2; i++)
		readdata += (char)read[i];
}
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364177</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364177</guid><dc:creator><![CDATA[Entfrickler]]></dc:creator><pubDate>Wed, 12 Sep 2007 17:28:21 GMT</pubDate></item><item><title><![CDATA[Reply to ReadFile langsam? Buffer überlauf? Woran liegts? on Thu, 13 Sep 2007 11:08:08 GMT]]></title><description><![CDATA[<p>Ok dankeschön!</p>
<p>Du meintest also: kommentare rauslöschen und ein bisschen mehr Platz lassen. Ich dachte du meintest dass der Code schrott ist.</p>
<p>edit: öhmn nur so, ich merk grad dass der post vermuten lassen könnte dass das Problem gelöst ist, ist es aber incht :D. Das ist der selbe Code nur etwas schöner dargestellt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364411</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364411</guid><dc:creator><![CDATA[neffetS]]></dc:creator><pubDate>Thu, 13 Sep 2007 11:08:08 GMT</pubDate></item></channel></rss>