<?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[Lesen aus seriellem Port]]></title><description><![CDATA[<p>Hi,</p>
<p>in meinem Lese-Code wird das Lesen erst beendet, wenn das 0xFF Zeichen kommt.<br />
Kann man dies ohne dieses Zeichen machen?</p>
<pre><code>while(1)
{
	if(WaitCommEvent(hComm, &amp;dwEventMask, NULL))
	{
		/*determine how many char are in RX buffer*/
		ClearCommError(hComm, p_error, &amp;stat);
		inQue = stat.cbInQue;
		/*Read them all at once*/
		ReadFile(hComm, &amp;buffer[i], inQue, &amp;dwRead, NULL);
		i += inQue;
	}else
		//Error in WaitCommEvent
		return(0);
	if(buffer[i-1] == 0xFF)
		break;
}
return(i);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/203058/lesen-aus-seriellem-port</link><generator>RSS for Node</generator><lastBuildDate>Wed, 22 Apr 2026 10:35:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/203058.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 18 Jan 2008 12:53:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Lesen aus seriellem Port on Fri, 18 Jan 2008 12:53:53 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>in meinem Lese-Code wird das Lesen erst beendet, wenn das 0xFF Zeichen kommt.<br />
Kann man dies ohne dieses Zeichen machen?</p>
<pre><code>while(1)
{
	if(WaitCommEvent(hComm, &amp;dwEventMask, NULL))
	{
		/*determine how many char are in RX buffer*/
		ClearCommError(hComm, p_error, &amp;stat);
		inQue = stat.cbInQue;
		/*Read them all at once*/
		ReadFile(hComm, &amp;buffer[i], inQue, &amp;dwRead, NULL);
		i += inQue;
	}else
		//Error in WaitCommEvent
		return(0);
	if(buffer[i-1] == 0xFF)
		break;
}
return(i);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1438972</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1438972</guid><dc:creator><![CDATA[JDHawk]]></dc:creator><pubDate>Fri, 18 Jan 2008 12:53:53 GMT</pubDate></item><item><title><![CDATA[Reply to Lesen aus seriellem Port on Fri, 18 Jan 2008 14:07:04 GMT]]></title><description><![CDATA[<p>Es hängt doch von Dir ab, wann Du die Schleife beendest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1439056</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1439056</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Fri, 18 Jan 2008 14:07:04 GMT</pubDate></item><item><title><![CDATA[Reply to Lesen aus seriellem Port on Fri, 18 Jan 2008 14:26:02 GMT]]></title><description><![CDATA[<p>Ja du hast recht, aber das Problem ist fogendes:<br />
Wenn das Zeichen 0xFF in der Nachricht enthalten ist, und er zufällig auf dieses stößt, so bricht er ab, obwohl vielleicht noch weitere ankommen.</p>
<p>Ist zwar in der praxis nicht vorgekommen, aber ich glaube das war nur Glück.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1439069</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1439069</guid><dc:creator><![CDATA[JDHawk]]></dc:creator><pubDate>Fri, 18 Jan 2008 14:26:02 GMT</pubDate></item><item><title><![CDATA[Reply to Lesen aus seriellem Port on Fri, 18 Jan 2008 14:47:41 GMT]]></title><description><![CDATA[<p>Dann muss für die Kommunikation eben ein entsprechendes Protokoll verwendet werden, dass regelt wie die Daten behandelt werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1439089</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1439089</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Fri, 18 Jan 2008 14:47:41 GMT</pubDate></item><item><title><![CDATA[Reply to Lesen aus seriellem Port on Fri, 18 Jan 2008 15:25:55 GMT]]></title><description><![CDATA[<p>JDHawk schrieb:</p>
<blockquote>
<p>Ist zwar in der praxis nicht vorgekommen, aber ich glaube das war nur Glück.</p>
</blockquote>
<p>Das kommt in der Praxis vor, daß Du parasitäre Bytes empfängst. Leider.<br />
Häufigste Ursache: Die serielle Leitung wirkt als Antenne für Störsignale.</p>
<p>D.h. Du müßtest Deine Empfangsroutine so programmieren, daß diese unerwünschten Bytes Dein Programm nicht aus dem Ruder wirft.</p>
<p>Idealerweise sollten Deine Übertragungsprotokolle oder -pakete immer eine Checksumme (z.B. CRC32) enthalten, damit Du überhaupt erkennen kannst daß was faul war.</p>
<p>Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1439112</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1439112</guid><dc:creator><![CDATA[Mmacher]]></dc:creator><pubDate>Fri, 18 Jan 2008 15:25:55 GMT</pubDate></item><item><title><![CDATA[Reply to Lesen aus seriellem Port on Tue, 22 Jan 2008 13:34:22 GMT]]></title><description><![CDATA[<p>Ein Protokoll (auch mit CRC) hab ich schon.<br />
Es geht hier um den empfang von Daten über die serielle Schnittstelle, über die Windows API.</p>
<p>Meine Überlegung (siehe viele andere Seiten):<br />
Er soll warten bis ein Zeichen im Rx Buffer ankommt,<br />
dann die angekommenen Zeichen zählen,<br />
dann alle auf einen Schlag aus dem Rx Buffer lesen.</p>
<p>Nun ist es so, dass auch mal Daten ankommen die größer als der Rx Buffer sind.<br />
In dem Fall dachte ich mir er soll das in ner Endlosschleifen machen, bis ein 0xFF Byte ankommt.</p>
<p>Das gefällt mir halt nicht. Ich dachte vielleicht kennt jemdand eine andere Möglichkeit. (Vielleicht eine Hilfsfunktion der WinAPI oder so)</p>
<p>Weil über diesen Char 0xFF ists blöd. Es kann ja sein das meine Nutzdaten ein 0xFF enthalten und schon bricht er ab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1441283</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1441283</guid><dc:creator><![CDATA[JDHawk]]></dc:creator><pubDate>Tue, 22 Jan 2008 13:34:22 GMT</pubDate></item><item><title><![CDATA[Reply to Lesen aus seriellem Port on Tue, 22 Jan 2008 16:36:28 GMT]]></title><description><![CDATA[<p>JDHawk schrieb:</p>
<blockquote>
<p>Weil über diesen Char 0xFF ists blöd. Es kann ja sein das meine Nutzdaten ein 0xFF enthalten und schon bricht er ab.</p>
</blockquote>
<p>Damit kannst Du das Verfahren mit dem Wert 0xFF als Abbruchkriterium schon mal in die Mülltonne werfen.</p>
<p>Bei meinen (professionellen) seriellen Kommunikationen verwende ich sowohl das &quot;Online&quot;-Parsing OK/nichtOK als auch die Timeout-Abbruchkriterien.</p>
<p>Das Online-Parsing (ich nenne das mal so) ist das Abholen bereits empfangener Bytes zu beliebigen Zeitpunkten aus dem Empfangsbuffer (bei mir in einem eigenen Thread). Und das gleichzeitige Erkennen von Protokoll-Frames in dieser Bytefolge. Wenn Erkennung und Plausibilitätscheck erfolgreich -&gt; dann diesen Frame zur Weiterverarbeitung an Hauptthread weiterreichen. Wenn nicht erfolgreich oder Frame enthält fehlerhafte Zeichen -&gt; den ganzen Frame verwerfen und auf das nächste gültige Frame hin abklopfen.</p>
<p>Mit dem Timeout-Abbruchkriterium habe ich ein relativ zuverlässiges Synchronisationshilfsmittel für das Online-Parsing (in der Größenordnung 50ms oder länger, da Windows kein Realtime-OS ist).</p>
<p>Was Synchronisation betrifft: Es erleichtert die Implementation eines solchen Online-Parsing ungemein, wenn die Protokolle immer mit einem definierten Zeichen beginnen z.B. '!' oder '#', damit kannst Du den Beginn eines Frames sehr leicht erkennen. (es ist klar, daß dieses Zeichen auch als Nutzdaten mitten im Frame oder als CRC-Byte vorkommen kann!)</p>
<p>Martin</p>
<p>P.S.: Frame=eine Anzahl von Bytes um ein Protokoll zu bilden, z.B. ein Frame enthält das Startbyte, ein(ige)Befehlsbyte(s), Nutzbytes und abschließend die CRC-Bytes. In der Regel befinden sich zwischen den Frames Sendepausen zwischen 2 und 100ms, um die Decodierung zu erleichtern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1441418</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1441418</guid><dc:creator><![CDATA[Mmacher]]></dc:creator><pubDate>Tue, 22 Jan 2008 16:36:28 GMT</pubDate></item><item><title><![CDATA[Reply to Lesen aus seriellem Port on Tue, 22 Jan 2008 17:14:42 GMT]]></title><description><![CDATA[<p>Ja aber woher weist du wann ein Frame ende?<br />
Oder verschickst du immer ein ganzes Frame und legst absichtlich eine Pause ein, damit er einen Timeout hervorruft?</p>
<p>Das wäre ja möglich, das mit den Timeouts lässt sich ja in der Konfiguration der seriellen Schnittstelle einstellen.</p>
<p>Im eigenen Thread ist auch super, dann müsste ich mich mal mit der Thread Thematik unter Win32 einarbeiten, ich hoffe nicht so schwer, in Linux gings eigentlich total einfach.</p>
<p>Ich habe auch ein Frame, mit allem drum und dran. Frage zu dem Frame: Bist du da wirklich bis in die Bitgrenzen mit den Flags usw. gegangen, oder reichen Bytegrenzen? Ich habe Bytegrenzen und so ein Frame kann bei mir bis zu 128Byte groß sein. (Ja ok, das wird wahrscheinlich davon abhängen wie schnell ich die Daten brauche)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1441454</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1441454</guid><dc:creator><![CDATA[JDHawk]]></dc:creator><pubDate>Tue, 22 Jan 2008 17:14:42 GMT</pubDate></item><item><title><![CDATA[Reply to Lesen aus seriellem Port on Tue, 22 Jan 2008 18:43:00 GMT]]></title><description><![CDATA[<p>JDHawk schrieb:</p>
<blockquote>
<p>Ja aber woher weist du wann ein Frame ende?<br />
Oder verschickst du immer ein ganzes Frame und legst absichtlich eine Pause ein, damit er einen Timeout hervorruft?</p>
</blockquote>
<p>Das ist Protokolldefinitionssache. Du kannst z.B. durch relativ lange Timeouts auch ein Frame-Ende signalisieren. Das funktioniert schlecht wenn Du möglichst viele Frames pro Sekunde übertragen haben möchtest, da sonst zuviel &quot;Funkstille&quot; zwischen den Frames erforderlich wäre.</p>
<p>Sinnvoller ist es, jeder Frame hat eine definierte Länge. Ich meine nicht, jeder Frame hat eine einheitliche Länge von z.B. 32 Bytes. Das wäre natürlich auch denkbar, wenn Du nur ganz simple Funktionen implementieren möchtest. Ich dachte da mehr an definierte Längen in Abhängigkeit von der Funktion des Frames. Z.B. im Frame steht ein Befehlsbyte 0xE4, dieser steht für eine bestimmte Funktion, und das resultiert in einer Gesamtlänge von 24 Bytes. Bei einem anderen Befehlsbyte eben eine andere Länge.</p>
<p>Somit kannst Du die Anzahl der eintrudelnden Bytes mitzählen. In den letzten zwei Bytes (auch das ist Protokolldefinitionssache) stehen die CRC-Prüfsummen, um so auch die Korrektheit des gesamten Frames überprüfen zu können.</p>
<p>JDHawk schrieb:</p>
<blockquote>
<p>Das wäre ja möglich, das mit den Timeouts lässt sich ja in der Konfiguration der seriellen Schnittstelle einstellen.</p>
</blockquote>
<p>Ja, aber erwarte nicht von Windows, daß sich (wenn Dein Thread ein Timeout-Ereignis verarbeitet) im Empfangsbuffer nur die angekommenen Zeichen bis zum Timeout befinden! Denn durch die Trägheit (ich sage mal das so) des OS sind im Empfangsbuffer vielleicht schon die ersten Zeichen vom nächsten Frame eingetrudelt... das macht das ganze in der Tat schon ein wenig schwieriger. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>JDHawk schrieb:</p>
<blockquote>
<p>Frage zu dem Frame: Bist du da wirklich bis in die Bitgrenzen mit den Flags usw. gegangen, oder reichen Bytegrenzen?</p>
</blockquote>
<p>Natürlich nur Bytegrenzen, denn an die Bitinformationen (gemeint sind hier Startbit, Datenbits und Stoppbits) kommst Du ja gar nicht vernünftig ran.</p>
<p>Ich persönlich würde Dir empfehlen, fange einfach mit einem einzigen definierten Frame mit einem definierten Inhalt an. Empfangs-Thread implementieren und die empfangenen Bytes irgendwie darstellen (Messagebox oder in Datei schreiben).<br />
Dann Funktionserweiterung um CRC-Check, usw. Erstmal nur um das Prinzip zu verstehen.<br />
Und dann kannst Du das ganze Konzept beliebig ausbauen, bis hin zu Busfähigkeit (mehrere Teilnehmer) <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Martin</p>
<p>P.S.: Eine serielle Schnittstelle mit WinAPI erfordert schon einen recht hohen Programmieraufwand. Vielleicht schaust Du Dir auch die fertigen Klassen oder Libraries an? Es gibt auch Freeware, z.B. <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/1441529</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1441529</guid><dc:creator><![CDATA[Mmacher]]></dc:creator><pubDate>Tue, 22 Jan 2008 18:43:00 GMT</pubDate></item><item><title><![CDATA[Reply to Lesen aus seriellem Port on Tue, 22 Jan 2008 18:50:53 GMT]]></title><description><![CDATA[<p>Pardon, was Busfähigkeit (mehrere Teilnehmer) betrifft: Natürlich nicht auf RS232, sondern z.B. über Konverter auf RS485.<br />
Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1441534</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1441534</guid><dc:creator><![CDATA[Mmacher]]></dc:creator><pubDate>Tue, 22 Jan 2008 18:50:53 GMT</pubDate></item><item><title><![CDATA[Reply to Lesen aus seriellem Port on Wed, 19 Mar 2008 09:08:17 GMT]]></title><description><![CDATA[<p>Mmacher schrieb:</p>
<blockquote>
<p>Pardon, was Busfähigkeit (mehrere Teilnehmer) betrifft: Natürlich nicht auf RS232, sondern z.B. über Konverter auf RS485.<br />
Martin</p>
</blockquote>
<p>Ich grab das Thema nochmal aus bevor ich ein neues erstelle <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Ich hab mir mit der WinAPI selber eine Schnittstelle gebaut,<br />
(keine Ahnung was daran so schwer sein soll ;O) nur hab ich<br />
jetzt das Problem das ich auch noch ein Startbit setzen muss,<br />
was ja soweit ich weiß mit den fertigen Libraries auch nicht geht.<br />
Weiß jemand wie ich so ein Startbit &quot;hintricksen&quot; kann?</p>
<p>Gruß,</p>
<p>Max</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1477069</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1477069</guid><dc:creator><![CDATA[blub* 0]]></dc:creator><pubDate>Wed, 19 Mar 2008 09:08:17 GMT</pubDate></item><item><title><![CDATA[Reply to Lesen aus seriellem Port on Sat, 29 Mar 2008 06:03:12 GMT]]></title><description><![CDATA[<p>Hi, bin auf groesserer Asien-Rundreise (und grad auf Phuket)...</p>
<p>Nein blub², Du musst Dich gar nicht um das Startbit kuemmern, das macht der UART (die Schnittstelle in den ICs) vollautomatisch.</p>
<p>Du musst lediglich definieren, wieviele Stoppbits (also 1, 1.5 oder 2 Stoppbits) der UART senden soll. Die Einstellungen hierzu findest Du in DCB, dort wo Du auch die Baudrate usw. einstellst (kann grad nicht nachsehen, da ich ja wie gesagt in Urlaub bin <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> ).</p>
<p>Martin</p>
<p>P.S.: Kann fast gar nicht glauben dass zuhause in Deutschland ein so kaltes Wetter herrscht</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1482528</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1482528</guid><dc:creator><![CDATA[Mmacher]]></dc:creator><pubDate>Sat, 29 Mar 2008 06:03:12 GMT</pubDate></item></channel></rss>