<?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[RS422 Geschwindigkeitsproblem beim Datenempfang]]></title><description><![CDATA[<p>Auch wenn das Thema serielle Schnittstelle hier sicherlich schon hundert mal besprochen wurde, muss ich doch noch einmal mit einem Problem aufwarten.</p>
<p>Derzeit versuche ich eine Art Datenlogger für ein Messgerät zu schreiben, welcher über eine RS422 die Daten aufzeichnen und in eine CSV Datei schreiben soll. Dazu habe ich mit Hilfe der Windows API eine Klasse für die Schnittstellenkommunikation geschrieben. Diese funktioniert problemlos bis zu einer Übertragungsrate von 115.200 kBits. Wenn ich aber die Übertragungsrate höher schraube, verliere ich aus irgendeinem Grund einzelne Bytes.</p>
<p>Zu erwähnen wäre vielleicht noch, dass das Messgerät mit einer Frequenz von 4kHz und 8 Byte pro Wert Daten für jeweils 300ms sendet (was ca. 2400 Bytes pro Übertragung sind). Ich habe schon mehrere andere Varianten probiert, aber es scheint einfach ein Problem bei hohen Übertragungsraten bei den von mir getesteten Varianten zu geben.</p>
<p>Ich ergänze mal eben die Routine der Klasse welche den Datenblock auffangen soll.</p>
<pre><code class="language-cpp">DWORD SER_COM::ser_com_read_timeout(char *cRead, DWORD iBytes, DWORD Time)
{
	DWORD dwCount = 0, dwCountAll = 0;
	DWORD dwEventMask = 0;
	bool timeOut = false;
	if(ComOpen)
	{
		do{
			WaitCommEvent(hComm, &amp;dwEventMask, &amp;ovReader);		//Auf Comm Event warten
			if(WaitForSingleObject(ovReader.hEvent, Time) == WAIT_OBJECT_0)
			{
				if((dwEventMask &amp; EV_RXFLAG) || (dwEventMask &amp; EV_RXCHAR))
				{
					do{
						ReadFile(hComm, &amp;cRead[dwCountAll], 1, &amp;dwCount, &amp;ovReader);	//Rückgabewert holen
						dwCountAll += dwCount;
					}while(dwCount &gt; 0);
					ResetEvent(ovReader.hEvent);
				}else{
					timeOut = true;
				}
			}else{
				timeOut = true;
			}
		}while(!timeOut);
	}
	return dwCountAll;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/199696/rs422-geschwindigkeitsproblem-beim-datenempfang</link><generator>RSS for Node</generator><lastBuildDate>Tue, 07 Apr 2026 09:15:25 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/199696.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 06 Dec 2007 09:41:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to RS422 Geschwindigkeitsproblem beim Datenempfang on Thu, 06 Dec 2007 09:41:18 GMT]]></title><description><![CDATA[<p>Auch wenn das Thema serielle Schnittstelle hier sicherlich schon hundert mal besprochen wurde, muss ich doch noch einmal mit einem Problem aufwarten.</p>
<p>Derzeit versuche ich eine Art Datenlogger für ein Messgerät zu schreiben, welcher über eine RS422 die Daten aufzeichnen und in eine CSV Datei schreiben soll. Dazu habe ich mit Hilfe der Windows API eine Klasse für die Schnittstellenkommunikation geschrieben. Diese funktioniert problemlos bis zu einer Übertragungsrate von 115.200 kBits. Wenn ich aber die Übertragungsrate höher schraube, verliere ich aus irgendeinem Grund einzelne Bytes.</p>
<p>Zu erwähnen wäre vielleicht noch, dass das Messgerät mit einer Frequenz von 4kHz und 8 Byte pro Wert Daten für jeweils 300ms sendet (was ca. 2400 Bytes pro Übertragung sind). Ich habe schon mehrere andere Varianten probiert, aber es scheint einfach ein Problem bei hohen Übertragungsraten bei den von mir getesteten Varianten zu geben.</p>
<p>Ich ergänze mal eben die Routine der Klasse welche den Datenblock auffangen soll.</p>
<pre><code class="language-cpp">DWORD SER_COM::ser_com_read_timeout(char *cRead, DWORD iBytes, DWORD Time)
{
	DWORD dwCount = 0, dwCountAll = 0;
	DWORD dwEventMask = 0;
	bool timeOut = false;
	if(ComOpen)
	{
		do{
			WaitCommEvent(hComm, &amp;dwEventMask, &amp;ovReader);		//Auf Comm Event warten
			if(WaitForSingleObject(ovReader.hEvent, Time) == WAIT_OBJECT_0)
			{
				if((dwEventMask &amp; EV_RXFLAG) || (dwEventMask &amp; EV_RXCHAR))
				{
					do{
						ReadFile(hComm, &amp;cRead[dwCountAll], 1, &amp;dwCount, &amp;ovReader);	//Rückgabewert holen
						dwCountAll += dwCount;
					}while(dwCount &gt; 0);
					ResetEvent(ovReader.hEvent);
				}else{
					timeOut = true;
				}
			}else{
				timeOut = true;
			}
		}while(!timeOut);
	}
	return dwCountAll;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1415674</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1415674</guid><dc:creator><![CDATA[mccrashman]]></dc:creator><pubDate>Thu, 06 Dec 2007 09:41:18 GMT</pubDate></item><item><title><![CDATA[Reply to RS422 Geschwindigkeitsproblem beim Datenempfang on Sat, 08 Dec 2007 15:12:50 GMT]]></title><description><![CDATA[<p>Hallo...</p>
<p>versuch doch erstmal praktisch zu ermitteln, ob dein PC und das Gerät höhere Datenraten überhaupt fehlerfrei unterstützten.<br />
Für serielle Schnittstellen ist bei 115KBit eigentlich offiziel schluss.<br />
es gibt aber geräte welche mit multiplikatoren arbeiten.<br />
evtl. ist das ja ein hardwareproblem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1417064</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1417064</guid><dc:creator><![CDATA[StefanKittel]]></dc:creator><pubDate>Sat, 08 Dec 2007 15:12:50 GMT</pubDate></item><item><title><![CDATA[Reply to RS422 Geschwindigkeitsproblem beim Datenempfang on Sat, 08 Dec 2007 21:46:45 GMT]]></title><description><![CDATA[<p>Ich habe mich in der Zwischenzeit mit anderen Entwicklern unterhalten und immer wieder gehört, dass die Windows API angeblich nicht mehr als 115200 kBit auf der seriellen Schnittstelle hergeben würde. Was ich allerdings nicht nachvollziehen kann.</p>
<p>Ich habe noch ein wenig mit dem RS422 Adapter herum gespielt und konnte in der Zwischenzeit bis auf 921600 kBit die Geschwindigkeit erhöhen. Bei einer Abtastrate des Messgerätes von 2kHz kommt alles noch sauber an, jedoch bei 4kHz verschwinden schon wieder einzelne Bytes. Komischer weise, verliert er diese immer wieder nach einem bestimmte Muster (jedes 63, 65 oder 67 Datenpacket das 7. oder 8. Byte)</p>
<p>Um ein wenig herum zu experimentieren habe ich in das selbe Programm einen Simulator eingebaut, bei dem ich das selbe Phänomen feststellen kann, wie mit dem Messgerät. Jetzt stellt sich mir die Frage, ob auf der Sende oder Empfangsseite die Daten verloren gehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1417320</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1417320</guid><dc:creator><![CDATA[mccrashman]]></dc:creator><pubDate>Sat, 08 Dec 2007 21:46:45 GMT</pubDate></item><item><title><![CDATA[Reply to RS422 Geschwindigkeitsproblem beim Datenempfang on Sat, 08 Dec 2007 22:19:15 GMT]]></title><description><![CDATA[<p>Gute Frage <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>wenn Dir dabei ein Zeitfenster von 55ms über den Weg läuft... Dies ist ein Intervall von Windows für alles mögliche. Besonders bei Timern. &quot;Normale&quot; Timer haben dieses Intervall als maximal mögliche Auflösung. Es soll aber bei DirectX hochpräzise Timer geben...</p>
<p>Ich bin damals beim programmieren eines empfängers für Infrarot beiname wahnsinnig geworden. ist aber lang her.</p>
<p>Stefan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1417336</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1417336</guid><dc:creator><![CDATA[StefanKittel]]></dc:creator><pubDate>Sat, 08 Dec 2007 22:19:15 GMT</pubDate></item><item><title><![CDATA[Reply to RS422 Geschwindigkeitsproblem beim Datenempfang on Mon, 10 Dec 2007 06:59:17 GMT]]></title><description><![CDATA[<p>Aus lauter Verzweiflung habe ich sogar schon testweise auf Polling umgestellt gehabt, jedoch ohne sichtbaren Erfolg.</p>
<p>Es kann eigentlich nur noch sein, dass entweder der Adapter oder Windows die Bytes verschluckt. Obwohl ich nicht glaube, dass Windows daran schuld ist.</p>
<p>Die Idee mit dem Timer Tick unter Windows habe ich mal durchgerechnet, jedoch passt das Intervall nicht (ca. 16ms bis ein Byte fehlt). Den eingzigen Timer, den ich nutze, ist der Timer für den Simulator und dieser läuft ausreichend präzise.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1417903</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1417903</guid><dc:creator><![CDATA[mccrashman]]></dc:creator><pubDate>Mon, 10 Dec 2007 06:59:17 GMT</pubDate></item><item><title><![CDATA[Reply to RS422 Geschwindigkeitsproblem beim Datenempfang on Tue, 11 Dec 2007 08:18:31 GMT]]></title><description><![CDATA[<p>Nachdem ich jetzt ein wenig mit dem Simulator des Programms gespielt habe, kann ich folgendes (etwas verwirrendes) Ergebnis liefern.</p>
<p>Wenn bei der Datenübetragung, die Messwerte (jeweils 8 Byte) in einem Abstand von über 0,3 ms gesendet werden, ist alles bestens. Darunter gehen nach 63 Datenpaketen immer wieder Bytes verschütt. Wenn ich jedoch die Daten in einem Stück sende, gehen keine Bytes verloren. Woher dieses Verhalten kommt kann ich nicht nachvollziehen, obwohl die Vermutung nahe liegt, dass es die RS422 Schnittstelle/Converter ist.</p>
<p>Ich habe zusätzlich die Empfangsroutine umgeschrieben, obwohl ich nicht glaube, dass dieses irgendwelche Auswirkungen hat.</p>
<pre><code class="language-cpp">DWORD SER_COM::ser_com_read(char *cRead, DWORD iBytes, DWORD Time)
{
	DWORD dwCount = 0, dwCountAll = 0;
	DWORD dwEventMask = 0, dwError;
	COMSTAT comstat;
	BOOL bReadStatus;
	if(ComOpen)
	{
		do{
			ClearCommError( hComm , &amp;dwError , &amp;comstat );
			if(comstat.cbInQue != 0)//hole hängende Bytes ab
			{	
				bReadStatus = ReadFile( hComm, &amp;cRead[dwCountAll], iBytes, &amp;dwCount, &amp;ovReader );
				dwCountAll += dwCount;
				if( !bReadStatus )
				{
					if( GetLastError() == ERROR_IO_PENDING )
					{
						WaitForSingleObject( ovReader.hEvent, Time );
					}
				}
			}else{					//Warte auf die nächsten Bytes
	            WaitCommEvent(hComm, &amp;dwEventMask, &amp;ovReader);
	            if(WaitForSingleObject(ovReader.hEvent, Time) == WAIT_OBJECT_0)
		        {
			        if((dwEventMask &amp; EV_RXFLAG) || (dwEventMask &amp; EV_RXCHAR))
				    {
					    do{
					        ReadFile(hComm, &amp;cRead[dwCountAll], 1, &amp;dwCount, &amp;ovReader);
					        dwCountAll += dwCount;
					    }while(dwCount &gt; 0);
					}
				}
			}

		}while(dwCountAll &lt; iBytes);
	}
	return dwCountAll;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1418538</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1418538</guid><dc:creator><![CDATA[mccrashman]]></dc:creator><pubDate>Tue, 11 Dec 2007 08:18:31 GMT</pubDate></item><item><title><![CDATA[Reply to RS422 Geschwindigkeitsproblem beim Datenempfang on Tue, 11 Dec 2007 20:42:45 GMT]]></title><description><![CDATA[<p>Hallo...</p>
<p>ich hatte mal eine Ansteuerung für Beta-Cam-Videorekorder für RS232 programmiert. Den gleichen Befehl konnte ich ohne Pause immer wieder schicken (z.B. die Abfrage des Zählerstandes). Sobald ich aber zwei Unterschiedliche Befehle im Wechsel gesendet habe, mußte ich immer 200ms warten. Sonst gabs Übertragungsfehler...</p>
<p>Stefan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1419050</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1419050</guid><dc:creator><![CDATA[StefanKittel]]></dc:creator><pubDate>Tue, 11 Dec 2007 20:42:45 GMT</pubDate></item></channel></rss>