<?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 mit Overlapped I&#x2F;O auslesen]]></title><description><![CDATA[<p>Hallo !</p>
<p>Ich habe mal wieder ein Verständnis-Problem, vielleicht kann mir ja jemand auf die Sprünge helfen.</p>
<p>Ich habe eine serielle Schnittstelle mit Overlapped-Flag geöffnet.<br />
Jetzt möchte ich <strong>nacheinander</strong> mit 2 Funktionen zugreifen.</p>
<p>1. Funktion sendet und empfängt Daten in ASCII<br />
--&gt; etwa so (sinngemäß)</p>
<pre><code class="language-cpp">func_1
{
    bool WeiterWarten;
    char c;
    OVERLAPPED  OV;

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

    WriteFile (hPort, Data, strlen(Data), &amp;nBytes, &amp;ov)   

    WeiterWarten = true;
    do 
    {
        bRet = WaitCommEvent (hPort, &amp;dwEventMask, &amp;ov);
        dwWait = WaitForSingleObject(ov.hEvent,INFINITE);

        if (dwWait == WAIT_OBJECT_0)
        {
            if (dwEventMask &amp; EV_RXCHAR)
            {
              do
              {
                if (ReadFile (hPort, &amp;c, 1, &amp;nBytes, &amp;ov))
                {
                    if (c == 0x0D)
                    {
                        WeiterWarten = false;
                        break;
                    }
                }
              } while ((nBytes &gt; 0) &amp;&amp; WeiterWarten);
            }
        } 
     } while (WeiterWarten);

     CloseHandle (OV.hEvent);
}
</code></pre>
<p>Funktion 2 soll nur Daten binär lesen</p>
<pre><code class="language-cpp">func_2
{
    bool WeiterWarten;
    char c;
    OVERLAPPED  OV;

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

    // Zuerst die Daten auslesen, die in func_1 noch nicht 
    // gelesen wurden, aber schon im Buffer waren...
    if (ReadFile (hPort, Data, 100, &amp;nBytes, &amp;ov))
    {
        if (nBytes &gt; 0)
        {
           ...
        }
    }

    // Jetzt auf weitere Daten warten
    WeiterWarten = true;
    do 
    {
        bRet = WaitCommEvent (hPort, &amp;dwEventMask, &amp;ov);
        dwWait = WaitForSingleObject(ov.hEvent,INFINITE);

        if (dwWait == WAIT_OBJECT_0)
        {
            if (dwEventMask &amp; EV_RXCHAR)
            {
              do
              {
                if (ReadFile (hPort, &amp;Data, 1, &amp;nBytes, &amp;ov))
                {
                }
              } while ((nBytes &gt; 0) &amp;&amp; WeiterWarten);
            }
        }
     } while (WeiterWarten);

     CloseHandle (OV.hEvent);
}
</code></pre>
<p>So. Es ist möglich, dass im Empfangspuffer noch Daten sind, wenn Funktion 1 verlassen wird. Ich erwarte nicht, deshalb nochmals ein Event zu bekommen und möchte deshalb die im Puffer vorhandenen Daten erstmal ohne Event in Func_2 auslesen.</p>
<p>Das geht so aber nicht, nBytes ist dort immer 0. Das bestätigt mir auch Sysinternals Portmon. Nach dem CR sind aber mit Sicherheit noch Daten bei der seriellen Schnittstelle angekommen (Analyzer!).</p>
<p>Also ich kann mit denken, dass man das Ganze so nicht machen darf. Aber was darf ich? Muss ich die Daten komplett auslesen nach einem Event bis ReadFile nBytes=0 liefert? Werden nicht gelesene Daten mit dem CloseHandle(OV.hEvent) verworfen?</p>
<p>Das würde doch aber bedeuten, dass ich selber noch mal eine Pufferverwaltung durchführen muss, aus denen sich dann 2 Funktionen bedienen können. Kann ich die Verwaltung des Empgangspuffers nicht Windows überlassen? Ich will ja nix machen, was Windows viel besser kann...</p>
<p>Danke für jede Antwort<br />
TomK</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/150358/serielle-schnittstelle-mit-overlapped-i-o-auslesen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 21 Jul 2026 03:39:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/150358.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 15 Jun 2006 15:28:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Serielle Schnittstelle mit Overlapped I&#x2F;O auslesen on Thu, 15 Jun 2006 15:28:28 GMT]]></title><description><![CDATA[<p>Hallo !</p>
<p>Ich habe mal wieder ein Verständnis-Problem, vielleicht kann mir ja jemand auf die Sprünge helfen.</p>
<p>Ich habe eine serielle Schnittstelle mit Overlapped-Flag geöffnet.<br />
Jetzt möchte ich <strong>nacheinander</strong> mit 2 Funktionen zugreifen.</p>
<p>1. Funktion sendet und empfängt Daten in ASCII<br />
--&gt; etwa so (sinngemäß)</p>
<pre><code class="language-cpp">func_1
{
    bool WeiterWarten;
    char c;
    OVERLAPPED  OV;

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

    WriteFile (hPort, Data, strlen(Data), &amp;nBytes, &amp;ov)   

    WeiterWarten = true;
    do 
    {
        bRet = WaitCommEvent (hPort, &amp;dwEventMask, &amp;ov);
        dwWait = WaitForSingleObject(ov.hEvent,INFINITE);

        if (dwWait == WAIT_OBJECT_0)
        {
            if (dwEventMask &amp; EV_RXCHAR)
            {
              do
              {
                if (ReadFile (hPort, &amp;c, 1, &amp;nBytes, &amp;ov))
                {
                    if (c == 0x0D)
                    {
                        WeiterWarten = false;
                        break;
                    }
                }
              } while ((nBytes &gt; 0) &amp;&amp; WeiterWarten);
            }
        } 
     } while (WeiterWarten);

     CloseHandle (OV.hEvent);
}
</code></pre>
<p>Funktion 2 soll nur Daten binär lesen</p>
<pre><code class="language-cpp">func_2
{
    bool WeiterWarten;
    char c;
    OVERLAPPED  OV;

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

    // Zuerst die Daten auslesen, die in func_1 noch nicht 
    // gelesen wurden, aber schon im Buffer waren...
    if (ReadFile (hPort, Data, 100, &amp;nBytes, &amp;ov))
    {
        if (nBytes &gt; 0)
        {
           ...
        }
    }

    // Jetzt auf weitere Daten warten
    WeiterWarten = true;
    do 
    {
        bRet = WaitCommEvent (hPort, &amp;dwEventMask, &amp;ov);
        dwWait = WaitForSingleObject(ov.hEvent,INFINITE);

        if (dwWait == WAIT_OBJECT_0)
        {
            if (dwEventMask &amp; EV_RXCHAR)
            {
              do
              {
                if (ReadFile (hPort, &amp;Data, 1, &amp;nBytes, &amp;ov))
                {
                }
              } while ((nBytes &gt; 0) &amp;&amp; WeiterWarten);
            }
        }
     } while (WeiterWarten);

     CloseHandle (OV.hEvent);
}
</code></pre>
<p>So. Es ist möglich, dass im Empfangspuffer noch Daten sind, wenn Funktion 1 verlassen wird. Ich erwarte nicht, deshalb nochmals ein Event zu bekommen und möchte deshalb die im Puffer vorhandenen Daten erstmal ohne Event in Func_2 auslesen.</p>
<p>Das geht so aber nicht, nBytes ist dort immer 0. Das bestätigt mir auch Sysinternals Portmon. Nach dem CR sind aber mit Sicherheit noch Daten bei der seriellen Schnittstelle angekommen (Analyzer!).</p>
<p>Also ich kann mit denken, dass man das Ganze so nicht machen darf. Aber was darf ich? Muss ich die Daten komplett auslesen nach einem Event bis ReadFile nBytes=0 liefert? Werden nicht gelesene Daten mit dem CloseHandle(OV.hEvent) verworfen?</p>
<p>Das würde doch aber bedeuten, dass ich selber noch mal eine Pufferverwaltung durchführen muss, aus denen sich dann 2 Funktionen bedienen können. Kann ich die Verwaltung des Empgangspuffers nicht Windows überlassen? Ich will ja nix machen, was Windows viel besser kann...</p>
<p>Danke für jede Antwort<br />
TomK</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1078291</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1078291</guid><dc:creator><![CDATA[TomK]]></dc:creator><pubDate>Thu, 15 Jun 2006 15:28:28 GMT</pubDate></item><item><title><![CDATA[Reply to Serielle Schnittstelle mit Overlapped I&#x2F;O auslesen on Thu, 15 Jun 2006 15:32:07 GMT]]></title><description><![CDATA[<p>Ich Rate immer dazu es nicht selber zu machen, oder sich zumindest laufende Beispiele anzuschauen:<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/1078295</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1078295</guid><dc:creator><![CDATA[Jochen Kalmbach]]></dc:creator><pubDate>Thu, 15 Jun 2006 15:32:07 GMT</pubDate></item><item><title><![CDATA[Reply to Serielle Schnittstelle mit Overlapped I&#x2F;O auslesen on Fri, 16 Jun 2006 10:25:11 GMT]]></title><description><![CDATA[<blockquote>
<p>Es ist möglich, dass im Empfangspuffer noch Daten sind, wenn Funktion 1 verlassen wird</p>
</blockquote>
<p>Nein.<br />
Sauber ist das erst, wenn nur ein einziger Thread liest. Dann wird immer mit dem aktuellen Zustand der ser. Schnittstelle gearbeitet und entsprechend darauf reagiert.<br />
Von da kann man die Daten zu beliebig anderen Threads via PostThreadMessage o.ä. senden.</p>
<p>Schreiben kann man von vielen anderen Funktion aus.<br />
Wenn auch das geordnet ablaufen soll, so legt man das Schreiben auch in einen extra Thread und pollt nach dem Ende der Übertragung, damit man weiß, wenn man neue Daten senden kann. Oder richtet eine Queue ein.</p>
<blockquote>
<p>... 1. Funktion sendet und empfängt Daten in ASCII ...</p>
</blockquote>
<p>Dann wird die Funktion und das Fenster aber blockiert sein, wenn keine Daten kommen. Das Empfangen geht in einem Thread besser.</p>
<p>Blackbird</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1078757</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1078757</guid><dc:creator><![CDATA[*Blackbird*]]></dc:creator><pubDate>Fri, 16 Jun 2006 10:25:11 GMT</pubDate></item><item><title><![CDATA[Reply to Serielle Schnittstelle mit Overlapped I&#x2F;O auslesen on Fri, 16 Jun 2006 19:36:33 GMT]]></title><description><![CDATA[<p>Hallo Blackbird, dann geht meine Vermutung schon in die richtige Richtung. Ich habe zwar noch nicht ganz kapiert, wieso das Ganze so ist, aber im Prinzip ist das auch ok. Danke für die Hinweise.</p>
<p>Und Danke für den Link, Jochen!</p>
<p>Gruß<br />
TomK</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1079158</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1079158</guid><dc:creator><![CDATA[TomK]]></dc:creator><pubDate>Fri, 16 Jun 2006 19:36:33 GMT</pubDate></item></channel></rss>