<?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[Fragen zur Nachrichtenbearbeitung der Klasse CSerialMFC]]></title><description><![CDATA[<p>Hallo.</p>
<p>In meinem Programm muss ich eine Digitalwaage und ein Multimeter messwerttechnisch erfassen. Beides besitzt eine serielle Schnittstelle. Um damit arbeiten zu können hab ich mir die viel empfohlene Klasse CSerial von <a href="http://www.codeprojekt.com" rel="nofollow">www.codeprojekt.com</a> besorgt und wie folgt verwendet:<br />
1. Erstellen eines Members meiner View-Klasse</p>
<pre><code class="language-cpp">class CSerial2View : public CView
{
protected: // Nur aus Serialisierung erstellen
	CSerial2View();
	DECLARE_DYNCREATE(CSerial2View)

// Attribute
public:
	CSerial2Doc* GetDocument() const;
	CSerialMFC		m_serial;
</code></pre>
<p>2. Initialisierung</p>
<pre><code class="language-cpp">void CSerial2View::OnSchnittstelleStart()
{
	// TODO: Fügen Sie hier Ihren Befehlsbehandlungscode ein.
	m_serial.Open(_T(&quot;COM1&quot;),this,WM_NULL,0,0,0);
	m_serial.Setup(CSerialMFC::EBaud9600,CSerialMFC::EData8,CSerialMFC::EParNone,CSerialMFC::EStop2);
	m_serial.SetupHandshaking(CSerialMFC::EHandshakeHardware);
	m_serial.SetMask(CSerialMFC::EEventRecv);
}
</code></pre>
<p>3. Aufräumen</p>
<pre><code class="language-cpp">CSerial2View::~CSerial2View()
{
	if (m_serial.IsOpen())
	m_serial.Close();
}
</code></pre>
<p>Das klappt soweit ganz gut. Meine Frage bezieht sich auf die Nachrichtenverarbeitung. Die Nachrichtenberabeitung habe ich wie in der Anleitung realisiert. Allerdings wird bei jedem Vorliegen von Daten zweimal in den Zweig &quot;if (eEvent &amp; CSerial::EEventRecv)&quot; gesprungen (somit muss auch zweimal die Message abgeschickt werden, dass Daten anliegen). Jedoch ist abBuffer beim zweiten Mal leer. Warum? Um jetzt Daten rausziehen zu können überprüfe ich jedes Mal die Länge des Strings und nur wenn er Daten enthält übernehme ich die. Ich habe es so realisiert:</p>
<pre><code class="language-cpp">LRESULT CSerial2View::OnSerialMsg (WPARAM wParam, LPARAM lParam)
{
	const CSerialMFC::EEvent eEvent = CSerialMFC::EEvent(LOWORD(wParam));
	const CSerialMFC::EError eError = CSerialMFC::EError(HIWORD(wParam));

	if (eError)
		AfxMessageBox(&quot;Es ist ein interner Fehler aufgetreten!&quot;,MB_OK);

	if (eEvent &amp; CSerialMFC::EEventBreak)
		AfxMessageBox(&quot;Breakevent&quot;,MB_OK);

	if (eEvent &amp; CSerialMFC::EEventError)
		AfxMessageBox(&quot;Line-Status-Error&quot;,MB_OK);

	if (eEvent &amp; CSerialMFC::EEventRcvEv)
		AfxMessageBox(&quot;Eventcharacter ist empfangen worden&quot;,MB_OK);

	if (eEvent &amp; CSerial::EEventRing)
		AfxMessageBox(&quot;Ring&quot;,MB_OK);

	if (eEvent &amp; CSerialMFC::EEventSend)
		AfxMessageBox(&quot;Alle Daten sind übertragen worden!&quot;,MB_OK);

	if (eEvent &amp; CSerialMFC::EEventCTS)
		AfxMessageBox(&quot;CTS Signal&quot;,MB_OK);

	if (eEvent &amp; CSerialMFC::EEventDSR)
		AfxMessageBox(&quot;DSR-Signal&quot;,MB_OK);

	if (eEvent &amp; CSerialMFC::EEventRLSD)
		AfxMessageBox(&quot;RLSD-Signal&quot;,MB_OK);

	if (eEvent &amp; CSerial::EEventRecv)
	{
			DWORD dwBytesRead = 0;
    BYTE  abBuffer[100];
	do
    {
        // Read data from the COM-port

        m_serial.Read(abBuffer,sizeof(abBuffer),&amp;dwBytesRead);

		abBuffer[dwBytesRead] = '\0';

     }
    while (dwBytesRead == sizeof(abBuffer));

	CString TempString;
	TempString=abBuffer;
	if (TempString.GetLength()&gt;0)
		{
			m_sAusgabe=abBuffer;
			char testchar[256];
			Invalidate();
			RedrawWindow();
		}

	}
	return 0;
}
</code></pre>
<p>Kennt jemand den Grund für dieses Verhalten? Weiterhin interessiert mich, warum die Schleifenbedingungen bitweise verknüft werden (also eEvent &amp; CSerial::EEventRecv) und nicht mit &amp;&amp;?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/146936/fragen-zur-nachrichtenbearbeitung-der-klasse-cserialmfc</link><generator>RSS for Node</generator><lastBuildDate>Fri, 17 Jul 2026 18:54:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/146936.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 12 May 2006 08:37:39 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Fragen zur Nachrichtenbearbeitung der Klasse CSerialMFC on Fri, 12 May 2006 08:37:39 GMT]]></title><description><![CDATA[<p>Hallo.</p>
<p>In meinem Programm muss ich eine Digitalwaage und ein Multimeter messwerttechnisch erfassen. Beides besitzt eine serielle Schnittstelle. Um damit arbeiten zu können hab ich mir die viel empfohlene Klasse CSerial von <a href="http://www.codeprojekt.com" rel="nofollow">www.codeprojekt.com</a> besorgt und wie folgt verwendet:<br />
1. Erstellen eines Members meiner View-Klasse</p>
<pre><code class="language-cpp">class CSerial2View : public CView
{
protected: // Nur aus Serialisierung erstellen
	CSerial2View();
	DECLARE_DYNCREATE(CSerial2View)

// Attribute
public:
	CSerial2Doc* GetDocument() const;
	CSerialMFC		m_serial;
</code></pre>
<p>2. Initialisierung</p>
<pre><code class="language-cpp">void CSerial2View::OnSchnittstelleStart()
{
	// TODO: Fügen Sie hier Ihren Befehlsbehandlungscode ein.
	m_serial.Open(_T(&quot;COM1&quot;),this,WM_NULL,0,0,0);
	m_serial.Setup(CSerialMFC::EBaud9600,CSerialMFC::EData8,CSerialMFC::EParNone,CSerialMFC::EStop2);
	m_serial.SetupHandshaking(CSerialMFC::EHandshakeHardware);
	m_serial.SetMask(CSerialMFC::EEventRecv);
}
</code></pre>
<p>3. Aufräumen</p>
<pre><code class="language-cpp">CSerial2View::~CSerial2View()
{
	if (m_serial.IsOpen())
	m_serial.Close();
}
</code></pre>
<p>Das klappt soweit ganz gut. Meine Frage bezieht sich auf die Nachrichtenverarbeitung. Die Nachrichtenberabeitung habe ich wie in der Anleitung realisiert. Allerdings wird bei jedem Vorliegen von Daten zweimal in den Zweig &quot;if (eEvent &amp; CSerial::EEventRecv)&quot; gesprungen (somit muss auch zweimal die Message abgeschickt werden, dass Daten anliegen). Jedoch ist abBuffer beim zweiten Mal leer. Warum? Um jetzt Daten rausziehen zu können überprüfe ich jedes Mal die Länge des Strings und nur wenn er Daten enthält übernehme ich die. Ich habe es so realisiert:</p>
<pre><code class="language-cpp">LRESULT CSerial2View::OnSerialMsg (WPARAM wParam, LPARAM lParam)
{
	const CSerialMFC::EEvent eEvent = CSerialMFC::EEvent(LOWORD(wParam));
	const CSerialMFC::EError eError = CSerialMFC::EError(HIWORD(wParam));

	if (eError)
		AfxMessageBox(&quot;Es ist ein interner Fehler aufgetreten!&quot;,MB_OK);

	if (eEvent &amp; CSerialMFC::EEventBreak)
		AfxMessageBox(&quot;Breakevent&quot;,MB_OK);

	if (eEvent &amp; CSerialMFC::EEventError)
		AfxMessageBox(&quot;Line-Status-Error&quot;,MB_OK);

	if (eEvent &amp; CSerialMFC::EEventRcvEv)
		AfxMessageBox(&quot;Eventcharacter ist empfangen worden&quot;,MB_OK);

	if (eEvent &amp; CSerial::EEventRing)
		AfxMessageBox(&quot;Ring&quot;,MB_OK);

	if (eEvent &amp; CSerialMFC::EEventSend)
		AfxMessageBox(&quot;Alle Daten sind übertragen worden!&quot;,MB_OK);

	if (eEvent &amp; CSerialMFC::EEventCTS)
		AfxMessageBox(&quot;CTS Signal&quot;,MB_OK);

	if (eEvent &amp; CSerialMFC::EEventDSR)
		AfxMessageBox(&quot;DSR-Signal&quot;,MB_OK);

	if (eEvent &amp; CSerialMFC::EEventRLSD)
		AfxMessageBox(&quot;RLSD-Signal&quot;,MB_OK);

	if (eEvent &amp; CSerial::EEventRecv)
	{
			DWORD dwBytesRead = 0;
    BYTE  abBuffer[100];
	do
    {
        // Read data from the COM-port

        m_serial.Read(abBuffer,sizeof(abBuffer),&amp;dwBytesRead);

		abBuffer[dwBytesRead] = '\0';

     }
    while (dwBytesRead == sizeof(abBuffer));

	CString TempString;
	TempString=abBuffer;
	if (TempString.GetLength()&gt;0)
		{
			m_sAusgabe=abBuffer;
			char testchar[256];
			Invalidate();
			RedrawWindow();
		}

	}
	return 0;
}
</code></pre>
<p>Kennt jemand den Grund für dieses Verhalten? Weiterhin interessiert mich, warum die Schleifenbedingungen bitweise verknüft werden (also eEvent &amp; CSerial::EEventRecv) und nicht mit &amp;&amp;?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1056195</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1056195</guid><dc:creator><![CDATA[AndyDD]]></dc:creator><pubDate>Fri, 12 May 2006 08:37:39 GMT</pubDate></item></channel></rss>