<?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[Serielle Schnittstelle - Je ein Thread für lesen&#x2F;schreiben]]></title><description><![CDATA[<p>Guten Morgen,<br />
ich habe ein Programm das in einem eigenen Thread bis jetzt im Hintergrund auf an der seriellen Schnittstelle eintreffenden Daten wartet.<br />
D.h. ich habe die Schnittstelle als Overlapped mit:</p>
<pre><code class="language-cpp">SetCommMask(hComm, EV_RXCHAR);
ol.hEvent = CreateEvent( NULL, FALSE, FALSE, NULL );
</code></pre>
<p>usw. geöffnet.</p>
<p>Mein Read-Thread wartet dann mit</p>
<pre><code class="language-cpp">if( ERROR_IO_PENDING == GetLastError() )
{
   if( WAIT_OBJECT_0 == WaitForSingleObject( ol.hEvent, 1000 ) )
   {
</code></pre>
<p>auf eintreffende Daten.</p>
<p>Dies funktioniert auch soweit.<br />
Nun sollen aber auch noch Daten gesendet werden. Starte ich dann einen zweiten Thread, in dem ich dann mit WriteFile() etwas senden möchte, schlägt dieses fehl.<br />
Wie komme ich mit meinem Write-Thread denn zwischen den Lesevorgang, ohne diesen zu unterbrechen? Die Schnittstelle soll Voll-Duplex arbeiten.</p>
<p>Ich weiß nicht ob es geht, aber am einfachsten wäre es doch, die Schnittstelle zweimal zu öffnen.</p>
<p>Danke und Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/208400/serielle-schnittstelle-je-ein-thread-für-lesen-schreiben</link><generator>RSS for Node</generator><lastBuildDate>Tue, 21 Apr 2026 08:48:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/208400.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 18 Mar 2008 08:44:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Serielle Schnittstelle - Je ein Thread für lesen&#x2F;schreiben on Tue, 18 Mar 2008 08:44:28 GMT]]></title><description><![CDATA[<p>Guten Morgen,<br />
ich habe ein Programm das in einem eigenen Thread bis jetzt im Hintergrund auf an der seriellen Schnittstelle eintreffenden Daten wartet.<br />
D.h. ich habe die Schnittstelle als Overlapped mit:</p>
<pre><code class="language-cpp">SetCommMask(hComm, EV_RXCHAR);
ol.hEvent = CreateEvent( NULL, FALSE, FALSE, NULL );
</code></pre>
<p>usw. geöffnet.</p>
<p>Mein Read-Thread wartet dann mit</p>
<pre><code class="language-cpp">if( ERROR_IO_PENDING == GetLastError() )
{
   if( WAIT_OBJECT_0 == WaitForSingleObject( ol.hEvent, 1000 ) )
   {
</code></pre>
<p>auf eintreffende Daten.</p>
<p>Dies funktioniert auch soweit.<br />
Nun sollen aber auch noch Daten gesendet werden. Starte ich dann einen zweiten Thread, in dem ich dann mit WriteFile() etwas senden möchte, schlägt dieses fehl.<br />
Wie komme ich mit meinem Write-Thread denn zwischen den Lesevorgang, ohne diesen zu unterbrechen? Die Schnittstelle soll Voll-Duplex arbeiten.</p>
<p>Ich weiß nicht ob es geht, aber am einfachsten wäre es doch, die Schnittstelle zweimal zu öffnen.</p>
<p>Danke und Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1476334</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1476334</guid><dc:creator><![CDATA[Frank_DA]]></dc:creator><pubDate>Tue, 18 Mar 2008 08:44:28 GMT</pubDate></item><item><title><![CDATA[Reply to Serielle Schnittstelle - Je ein Thread für lesen&#x2F;schreiben on Tue, 18 Mar 2008 09:43:09 GMT]]></title><description><![CDATA[<p>Dieser Thread wurde von Moderator/in <a href="http://www.c-plusplus.net/forum/profile-var-mode-is-viewprofile-and-u-is-403.html" rel="nofollow">HumeSikkins</a> aus dem Forum <a href="http://www.c-plusplus.net/forum/viewforum-var-f-is-15.html" rel="nofollow">C++</a> in das Forum <a href="http://www.c-plusplus.net/forum/viewforum-var-f-is-4.html" rel="nofollow">WinAPI</a> verschoben.</p>
<p>Im Zweifelsfall bitte auch folgende Hinweise beachten:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-39405.html" rel="nofollow">C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?</a></p>
<p><em>Dieses Posting wurde automatisch erzeugt.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1476369</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1476369</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Tue, 18 Mar 2008 09:43:09 GMT</pubDate></item><item><title><![CDATA[Reply to Serielle Schnittstelle - Je ein Thread für lesen&#x2F;schreiben on Tue, 18 Mar 2008 09:57:38 GMT]]></title><description><![CDATA[<p>Warum schlägt das fehl?</p>
<p>1. Du musst das selbe File Handle benutzten und nicht einen neuen Port öffnen.<br />
2. Du musst eine eigene Overlapped Struktur aufbauen und ein eigenes Eventhandle für den Overlapped IO verwenden.</p>
<p>Das ist IMHO alles.<br />
Eine nette Diskussion zu dem Thema gibt es hier (allerdings ist etwas MFC Code dabei, den man aber auch vergessen kann).<br />
<a href="http://www.flounder.com/serial.htm" rel="nofollow">http://www.flounder.com/serial.htm</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1476379</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1476379</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Tue, 18 Mar 2008 09:57:38 GMT</pubDate></item><item><title><![CDATA[Reply to Serielle Schnittstelle - Je ein Thread für lesen&#x2F;schreiben on Tue, 18 Mar 2008 10:16:45 GMT]]></title><description><![CDATA[<p>Martin Richter schrieb:</p>
<blockquote>
<p>2. Du musst eine eigene Overlapped Struktur aufbauen und ein eigenes Eventhandle für den Overlapped IO verwenden.</p>
</blockquote>
<p>Ah, ich hatte die gleiche Overlapped-Struktur für das Lesen und Schreiben verwendet. Ich schau' mal ob es daran schon gelegen hat.<br />
Danke für den Link, untern den zig Serielle Schnittstelle Artikeln ist der meinem Prinzip ja ähnlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1476401</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1476401</guid><dc:creator><![CDATA[Frank_DA]]></dc:creator><pubDate>Tue, 18 Mar 2008 10:16:45 GMT</pubDate></item><item><title><![CDATA[Reply to Serielle Schnittstelle - Je ein Thread für lesen&#x2F;schreiben on Wed, 19 Mar 2008 21:36:38 GMT]]></title><description><![CDATA[<p>Ein Problem habe ich noch. Ich habe das vom Prinzip her jetzt so wie auf der Seite <a href="http://www.flounder.com/serial.htm" rel="nofollow">http://www.flounder.com/serial.htm</a><br />
Das Phänomen das ich habe ist, dass immer das erste Zeichen das auf der seriellen hereinkommt verschluckt wird. Das ist wohl das erste Zeichen, das in der Zeit während WaitForSingleObject wartet.</p>
<pre><code class="language-cpp">for(;;)
{
  ok = ReadFile(hComm, buf, sizeof(buf) - 1, &amp;dwRead, &amp;ol);
  if(!ok)
  { // error
    // Es konnten keine Daten gelesen werden, dann auf Event warten
    if( ERROR_IO_PENDING != GetLastError() )
    {
      // Grober Fehler, abbrechen
      m_endReadThread = true;
    }
    else
    {
      if(WaitForSingleObject(ol.hEvent, WAIT_SINGLE_OBJ_TIMEOUT_MS ) == WAIT_OBJECT_0)
      {
        ok = GetOverlappedResult(hComm, &amp;ol, &amp;dwRead, TRUE);
        if(!ok)
        { // GetOverlappedResult failed
          printf(&quot;GetOverlappedResult failed&quot;);
        }
        // else -&gt; Daten sind da
      }
      else
      { // Timeout					
        timeout_to_flush += WAIT_SINGLE_OBJ_TIMEOUT_MS;
        if (timeout_to_flush &gt;= m_packingAlgoTransmit_ms)
        {
          timeout_to_flush = 0;
          flush_buffer = true;
        }
      }
    }
  }
}
</code></pre>
<p>WAIT_SINGLE_OBJ_TIMEOUT_MS habe ich auf 100 stehen. Kommen nun 2 Zeichen auf der Seriellen herein, so kommt das ReadFile mit dwRead = 0 zurück, bei GetOverlappedResult dwRead anschließend mit 1 anstatt 2.<br />
Schicke ich nur ein einzelnes Zeichen, so kommt dieses auch direkt heraus. Äußerst seltsam.</p>
<p>WaitCommEvent kann ich nicht verwenden, da in einem anderen Thread die Daten mittels WriteFile geschrieben werden.</p>
<p>Hat vielleicht jemand noch einen Hinweis?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1477548</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1477548</guid><dc:creator><![CDATA[Frank_DA]]></dc:creator><pubDate>Wed, 19 Mar 2008 21:36:38 GMT</pubDate></item><item><title><![CDATA[Reply to Serielle Schnittstelle - Je ein Thread für lesen&#x2F;schreiben on Wed, 19 Mar 2008 22:24:46 GMT]]></title><description><![CDATA[<p>1. Wie groß ist buf?<br />
2. Wenn GetOverlappedResult OK angibt, solltest Du auch die Schleife beenden, denn Du hast ja dann Dein Byte(s).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1477559</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1477559</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Wed, 19 Mar 2008 22:24:46 GMT</pubDate></item><item><title><![CDATA[Reply to Serielle Schnittstelle - Je ein Thread für lesen&#x2F;schreiben on Wed, 19 Mar 2008 23:02:09 GMT]]></title><description><![CDATA[<p>Hi,<br />
1)<br />
buf hat 1500 Bytes.<br />
Aber es werden bei mir unabhängig von Baudrate und Zeiten nie mehr als 13 Bytes am Stück gelesen.</p>
<ol start="2">
<li></li>
</ol>
<p>Am Ende der Schleife wird noch das Telegramm zusammengebaut. Dieses ist etwas größer darum habe ich das oben nicht hineinkopiert.</p>
<p>Ich habe mir aber zu Testzwecken direkt unter GetOverlappedResult den Wert von dwRead ausgeben lassen, und dort kommt wirklich eine 1 auch wenn ich zwei Zeichen schicke.</p>
<p>Mache ich die Zeit für WaitForSingleObject länger auf z.B. 1000 ms, so passiert dieses nicht. Bei 100 ms wird wie geschrieben immer ein Zeichen eines Aufrufes verschluckt.</p>
<p>Aber ich kann erstens nicht so lange auf den Event warten, und zweitens kann das ja eigentlich nicht an der Zeit, sondern an irgendeinem Programmfehler liegen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1477571</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1477571</guid><dc:creator><![CDATA[Frank_DA]]></dc:creator><pubDate>Wed, 19 Mar 2008 23:02:09 GMT</pubDate></item><item><title><![CDATA[Reply to Serielle Schnittstelle - Je ein Thread für lesen&#x2F;schreiben on Thu, 20 Mar 2008 10:40:04 GMT]]></title><description><![CDATA[<p>Beim Testen habe ich eben noch festgestellt, dass es auch irgendwie mit den Read-Timeouts die ich mittels SetCommTimeouts setze zusammenhängt.<br />
Mache ich den Wert ganz klein auf 1 ms werden Zeichen verschluckt. Bei großen Werten z.B. 1000 ms ebenso.</p>
<p>Haben die Timeouts überhaupt noch eine Funktion wenn ich Overlapped I/O verwende?</p>
<p>Um Fehler in der Thread-Geschichte auszuschließen, habe ich das in ein eigenes kleines Programm geschrieben, dort tritt das ebenso auf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1477694</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1477694</guid><dc:creator><![CDATA[Frank_DA]]></dc:creator><pubDate>Thu, 20 Mar 2008 10:40:04 GMT</pubDate></item><item><title><![CDATA[Reply to Serielle Schnittstelle - Je ein Thread für lesen&#x2F;schreiben on Sat, 22 Mar 2008 13:19:08 GMT]]></title><description><![CDATA[<p>Irgendwie ist das mit den Timeouts doch kompliziert. Ist denn das Prinzip das ich habe verkehrt?</p>
<p>Einstellungen die ich getestet habe:</p>
<pre><code class="language-cpp">timeouts.ReadIntervalTimeout        = MAXDWORD;
timeouts.ReadTotalTimeoutMultiplier = 0;
timeouts.ReadTotalTimeoutConstant   = 0;
</code></pre>
<p>ReadFile kehrt unmittelbar zurück, auch wenn kein Zeichen gelesen werden konnte. Da der Rückgabewert aber 0 ist, kann<br />
ich nicht mittels GetLastError() auf ERROR_IO_PENDING prüfen.<br />
Diese Seite hier:<br />
<a href="http://www.lookrs232.com/com_port_programming/api_timeout.htm" rel="nofollow">http://www.lookrs232.com/com_port_programming/api_timeout.htm</a><br />
sagt zwar dass dies die Einstellungen für Event-basierende Abfragen sein sollen, aber dem ist ja eigentlich nicht so.</p>
<pre><code class="language-cpp">timeouts.ReadIntervalTimeout        = MAXDWORD;
timeouts.ReadTotalTimeoutMultiplier = MAXDWORD;;
timeouts.ReadTotalTimeoutConstant   = 10;
</code></pre>
<p>Hier sollte eigentlich ReadFile(), wenn nach 10 ms kein Zeichen gelesen werden konnte, mit einem Timeout zurückgehren.<br />
Es gibt aber != 0 zurück auch wenn kein Zeichen ankommt.</p>
<pre><code class="language-cpp">timeouts.ReadIntervalTimeout        = MAXDWORD;
timeouts.ReadTotalTimeoutMultiplier = MAXDWORD;;
timeouts.ReadTotalTimeoutConstant   = 100;
</code></pre>
<p>Bei der Zeit kehrt ReadFile() wie gedacht mit einem Timeout zurück, sodass man mit WaitForSingleObject() warten kann.<br />
Wenn ich dann bei WaitForSingleObject aber weniger als 100 ms warten möchte, gehen Zeichen verloren.</p>
<p>Diese Zeit ist mir aber zu lange, und aufgrund dessen dass ich die Schnittstellen Timeouts nicht verkürzen kann schließt sich das<br />
gegenseitig irgendwie aus.</p>
<p>Wäre schön wenn hier doch noch jemand Licht ins Dunkel bringen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1478722</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1478722</guid><dc:creator><![CDATA[Frank_DA]]></dc:creator><pubDate>Sat, 22 Mar 2008 13:19:08 GMT</pubDate></item><item><title><![CDATA[Reply to Serielle Schnittstelle - Je ein Thread für lesen&#x2F;schreiben on Fri, 25 Apr 2008 19:41:24 GMT]]></title><description><![CDATA[<p>Warum machst Du das mit threads? Viel mehr Möglichkeiten hat man mit<br />
eigenständigen Prozessen (gleich verschiedene Programme), einer zum Lesen und<br />
einer zum Bearbeiten der Daten. Hierfür müssen beide Prozesse über die Fensterhandles miteinander kommunizieren. Die Daten tauscht man schnell und bequem mit SendMessage(hwndProc,ID_XXX,idWas,iDatum) aus. Die Daten müssen natürlich integers sein. Eine besondere Synchronisation ist gewöhnlich nicht erforderlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1498274</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1498274</guid><dc:creator><![CDATA[berniebutt]]></dc:creator><pubDate>Fri, 25 Apr 2008 19:41:24 GMT</pubDate></item><item><title><![CDATA[Reply to Serielle Schnittstelle - Je ein Thread für lesen&#x2F;schreiben on Fri, 25 Apr 2008 20:04:50 GMT]]></title><description><![CDATA[<p>berniebutt schrieb:</p>
<blockquote>
<p>Warum machst Du das mit threads? Viel mehr Möglichkeiten hat man mit<br />
eigenständigen Prozessen (gleich verschiedene Programme), einer zum Lesen und<br />
einer zum Bearbeiten der Daten. Hierfür müssen beide Prozesse über die Fensterhandles miteinander kommunizieren. Die Daten tauscht man schnell und bequem mit SendMessage(hwndProc,ID_XXX,idWas,iDatum) aus. Die Daten müssen natürlich integers sein. Eine besondere Synchronisation ist gewöhnlich nicht erforderlich.</p>
</blockquote>
<p>rofl</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1498286</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1498286</guid><dc:creator><![CDATA[rofl-realer]]></dc:creator><pubDate>Fri, 25 Apr 2008 20:04:50 GMT</pubDate></item></channel></rss>