<?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[USB-Serial C++ Timing Probleme]]></title><description><![CDATA[<p>Hallo Zusammen <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>Ich habe ein C++ Programm geschrieben um einen Sensor unter Linux<br />
auszulesen. Es handelt sich um den CHR-6dm, der per USB angeschlossen<br />
wird, aber per serieller Schnittstelle (/dev/ttyUSB0) ausgelesen.<br />
Es handelt sich um einen USB Serial Converter: Future Technology Devices<br />
International, Ltd FT232 USB-Serial (UART) IC<br />
Ich kann über diese Schnittstelle mit dem CHR-6dm kommunizieren, was<br />
auch schon sehr gut klappt. Im Prinzip geht es mir nur darum, möglichst<br />
schnell Daten auszulesen. Dies ist von 20-300Hz möglich:<br />
&quot;The CHR-6dm is factory-configured to broadcast angles and angular rates<br />
at 200 Hz over a TTL UART at 115200 baud. The serial protocol uses 8<br />
data bits, 1 stop bit, and no parity.&quot;<br />
Der Sensor schickt mir genau 39 Byte die ich lesen möchte.</p>
<p>Ich öffne also eine serielle Verbindung:</p>
<p>// Seriell Schnittstelle öffnen und konfigurieren<br />
int fd_seriell = open(&quot;/dev/ttyUSB0&quot;, O_RDWR | O_NOCTTY | O_NDELAY |<br />
O_NONBLOCK);<br />
int flags = fcntl(fd_seriell, F_GETFL);<br />
flags = ( O_DIRECT | O_FSYNC | O_RSYNC | O_DSYNC);<br />
if (fd_seriell == -1) perror(&quot;open_port: Unable to open serial port<br />
&quot;);<br />
else fcntl(fd_seriell, F_SETFL, 0);<br />
leselaenge = 39;<br />
setzeOptionen(&amp;fd_seriell);</p>
<p>und konfiguriere sie:<br />
<a href="http://nopaste.immersight.de/?3ad970837b6016ae#JIN" rel="nofollow">http://nopaste.immersight.de/?3ad970837b6016ae#JIN</a>...<br />
Die Zeit zwischen dem Lesen von der Schnittstelle messe ich dabei. Das<br />
Gerät ist auf 300 Hz eingestellt uns sendet mir damit alle 5,5ms 39<br />
Byte.<br />
read((*p_fd_seriell),&amp;stream,leselaenge);//Stream lesen</p>
<p>Das Ergebnis ist leider nicht zufriedenstellend. Anstatt alle 5,5ms<br />
einen Wert auszulesen, ergibt sich dieses komische Muster:<br />
<a href="http://nopaste.immersight.de/?d00eb0eb88bf16d7#Z5e" rel="nofollow">http://nopaste.immersight.de/?d00eb0eb88bf16d7#Z5e</a>...</p>
<p>Als hässliche Lösung habe ich das nun so gemacht. Vor dem Read setze ich<br />
den Thread einfach 3ms schlafen:<br />
boost::this_thread::sleep(boost::posix_time::microseconds(3000));<br />
Dann ergibt sich ein regelmäßiges Muster wie ich es gerne hätte (der<br />
Beweis dass es geht):<br />
<a href="http://nopaste.immersight.de/?95e44e07fbf177f3#BmX" rel="nofollow">http://nopaste.immersight.de/?95e44e07fbf177f3#BmX</a>...</p>
<p>Ich frage mich warum der read-Aufruf nicht einfach wartet bis wieder 39<br />
Byte vorhanden sind. Wie kann denn in 3 mal nacheinander in 0.05ms etwas<br />
ausgelesen werden?</p>
<p>Vielen Dank schonmal im Voraus! <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>
]]></description><link>https://www.c-plusplus.net/forum/topic/305953/usb-serial-c-timing-probleme</link><generator>RSS for Node</generator><lastBuildDate>Sat, 08 Aug 2026 12:25:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/305953.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 13 Jul 2012 14:37:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to USB-Serial C++ Timing Probleme on Fri, 13 Jul 2012 14:37:18 GMT]]></title><description><![CDATA[<p>Hallo Zusammen <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>Ich habe ein C++ Programm geschrieben um einen Sensor unter Linux<br />
auszulesen. Es handelt sich um den CHR-6dm, der per USB angeschlossen<br />
wird, aber per serieller Schnittstelle (/dev/ttyUSB0) ausgelesen.<br />
Es handelt sich um einen USB Serial Converter: Future Technology Devices<br />
International, Ltd FT232 USB-Serial (UART) IC<br />
Ich kann über diese Schnittstelle mit dem CHR-6dm kommunizieren, was<br />
auch schon sehr gut klappt. Im Prinzip geht es mir nur darum, möglichst<br />
schnell Daten auszulesen. Dies ist von 20-300Hz möglich:<br />
&quot;The CHR-6dm is factory-configured to broadcast angles and angular rates<br />
at 200 Hz over a TTL UART at 115200 baud. The serial protocol uses 8<br />
data bits, 1 stop bit, and no parity.&quot;<br />
Der Sensor schickt mir genau 39 Byte die ich lesen möchte.</p>
<p>Ich öffne also eine serielle Verbindung:</p>
<p>// Seriell Schnittstelle öffnen und konfigurieren<br />
int fd_seriell = open(&quot;/dev/ttyUSB0&quot;, O_RDWR | O_NOCTTY | O_NDELAY |<br />
O_NONBLOCK);<br />
int flags = fcntl(fd_seriell, F_GETFL);<br />
flags = ( O_DIRECT | O_FSYNC | O_RSYNC | O_DSYNC);<br />
if (fd_seriell == -1) perror(&quot;open_port: Unable to open serial port<br />
&quot;);<br />
else fcntl(fd_seriell, F_SETFL, 0);<br />
leselaenge = 39;<br />
setzeOptionen(&amp;fd_seriell);</p>
<p>und konfiguriere sie:<br />
<a href="http://nopaste.immersight.de/?3ad970837b6016ae#JIN" rel="nofollow">http://nopaste.immersight.de/?3ad970837b6016ae#JIN</a>...<br />
Die Zeit zwischen dem Lesen von der Schnittstelle messe ich dabei. Das<br />
Gerät ist auf 300 Hz eingestellt uns sendet mir damit alle 5,5ms 39<br />
Byte.<br />
read((*p_fd_seriell),&amp;stream,leselaenge);//Stream lesen</p>
<p>Das Ergebnis ist leider nicht zufriedenstellend. Anstatt alle 5,5ms<br />
einen Wert auszulesen, ergibt sich dieses komische Muster:<br />
<a href="http://nopaste.immersight.de/?d00eb0eb88bf16d7#Z5e" rel="nofollow">http://nopaste.immersight.de/?d00eb0eb88bf16d7#Z5e</a>...</p>
<p>Als hässliche Lösung habe ich das nun so gemacht. Vor dem Read setze ich<br />
den Thread einfach 3ms schlafen:<br />
boost::this_thread::sleep(boost::posix_time::microseconds(3000));<br />
Dann ergibt sich ein regelmäßiges Muster wie ich es gerne hätte (der<br />
Beweis dass es geht):<br />
<a href="http://nopaste.immersight.de/?95e44e07fbf177f3#BmX" rel="nofollow">http://nopaste.immersight.de/?95e44e07fbf177f3#BmX</a>...</p>
<p>Ich frage mich warum der read-Aufruf nicht einfach wartet bis wieder 39<br />
Byte vorhanden sind. Wie kann denn in 3 mal nacheinander in 0.05ms etwas<br />
ausgelesen werden?</p>
<p>Vielen Dank schonmal im Voraus! <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2232480</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2232480</guid><dc:creator><![CDATA[fabske]]></dc:creator><pubDate>Fri, 13 Jul 2012 14:37:18 GMT</pubDate></item><item><title><![CDATA[Reply to USB-Serial C++ Timing Probleme on Fri, 13 Jul 2012 15:46:39 GMT]]></title><description><![CDATA[<p>Ich mache sowas anders:<br />
1.) Warten auf Daten<br />
2.) Alle verfuegbaren Daten auslesen<br />
3.) Parsen der Daten, falls vollstaendig Paket in Messagequeue schreiben<br />
4.) Goto 1.)</p>
<blockquote>
<p>Ich frage mich warum der read-Aufruf nicht einfach wartet bis wieder 39<br />
Byte vorhanden sind</p>
</blockquote>
<p>man read schrieb:</p>
<blockquote>
<p>read() <strong>attempts</strong> to read <strong>up to</strong> count bytes from file descriptor fd into the buffer starting at buf.</p>
</blockquote>
<p>Also ganz einfach: weil das Verhalten der Funktion nicht so spezifiziert ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2232502</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2232502</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Fri, 13 Jul 2012 15:46:39 GMT</pubDate></item><item><title><![CDATA[Reply to USB-Serial C++ Timing Probleme on Mon, 16 Jul 2012 10:03:53 GMT]]></title><description><![CDATA[<p>Hab nun die Ausgabe um eine Angabe der gelesenen Byte erweitert:<br />
<a href="http://nopaste.immersight.de/?5a40863665485dd0#1z84uxEzXxHnjDgX6ImBSpSaCAOLHF/BwCyH4vg5v5Q=" rel="nofollow">http://nopaste.immersight.de/?5a40863665485dd0#1z84uxEzXxHnjDgX6ImBSpSaCAOLHF/BwCyH4vg5v5Q=</a></p>
<p>Man sieht deutlich dass er immer nur 39 Byte liest! Ich will eigentlich einen blockierenden Aufruf haben der 4 MilliSekunden blockiert (sollte) und mir dadurch einen super Takt liefert. (Diese Kode läuft in einem eigenen Thread!).<br />
Also die Aussage das read hier mehr oder weniger als 39 Byte liest lässt sich nicht bestätigen knivil.</p>
<blockquote>
<p>Ich mache sowas anders:<br />
1.) Warten auf Daten<br />
2.) Alle verfuegbaren Daten auslesen<br />
3.) Parsen der Daten, falls vollstaendig Paket in Messagequeue schreiben<br />
4.) Goto 1.)</p>
</blockquote>
<p>Wie machst du denn das? Mit einem Signal? Ich warte ja auch auf Daten, nämlich bis 39 Byte angekommen sind, das macht doch read? Oder wie soll man das sonst machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2233139</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2233139</guid><dc:creator><![CDATA[fabske]]></dc:creator><pubDate>Mon, 16 Jul 2012 10:03:53 GMT</pubDate></item><item><title><![CDATA[Reply to USB-Serial C++ Timing Probleme on Mon, 16 Jul 2012 15:34:06 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/23152">@fabske</a><br />
Poste mal den gesamten Code deiner Empfangsschleife.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2233244</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2233244</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 16 Jul 2012 15:34:06 GMT</pubDate></item><item><title><![CDATA[Reply to USB-Serial C++ Timing Probleme on Mon, 16 Jul 2012 16:00:11 GMT]]></title><description><![CDATA[<blockquote>
<p>und mir dadurch einen super Takt liefert.</p>
</blockquote>
<p>Etwa 1000 Lines of Code brauche ich dafuer (geschaetzt). Habe gerade mein Projekt nicht zur Hand, um nachzuzaehlen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2233254</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2233254</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 16 Jul 2012 16:00:11 GMT</pubDate></item><item><title><![CDATA[Reply to USB-Serial C++ Timing Probleme on Tue, 17 Jul 2012 07:00:13 GMT]]></title><description><![CDATA[<p>Wie gesagt, es handelt sich um ein Modul innerhalb eines Frameworks das in einem eigenen Thread (arbeiten()) läuft: <a href="http://nopaste.immersight.de/?0051b943683dc619#wdtCo8wtxDqlUCQcTu6YsoLjNFYYjvkOJwjQtIgsoAI=" rel="nofollow">http://nopaste.immersight.de/?0051b943683dc619#wdtCo8wtxDqlUCQcTu6YsoLjNFYYjvkOJwjQtIgsoAI=</a></p>
<p>Mich würde echt interessieren knivil wie du USB halbwegs echtzeitfähig machst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2233372</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2233372</guid><dc:creator><![CDATA[fabske]]></dc:creator><pubDate>Tue, 17 Jul 2012 07:00:13 GMT</pubDate></item><item><title><![CDATA[Reply to USB-Serial C++ Timing Probleme on Tue, 17 Jul 2012 09:04:12 GMT]]></title><description><![CDATA[<p>1.) Also ein Thread liesst Daten und packt das Paket* in eine Msg-Queue ( <a href="http://www.youtube.com/watch?v=309Y-QlIvew&amp;list=PL1835A90FC78FF8BE&amp;index=9&amp;feature=plpp_video" rel="nofollow">http://www.youtube.com/watch?v=309Y-QlIvew&amp;list=PL1835A90FC78FF8BE&amp;index=9&amp;feature=plpp_video</a> )<br />
2.) Ein anderer Thread wartet solande, bis ein Paket in der Msg-Queue verfuegbar ist.</p>
<p>Producer &amp; Consumer halt. Die meiste Arbeit ist in die Ansteuerung des Com-Ports geflossen. Unter Windows mit AsyncIO. Echtzeitfaehig ... naja, manchmal liegen 2 Pakete in der Msg-Queue (bei 1000 Hz Sendefrequenz). Aber Windows ist kein Echtzeitsystem.</p>
<p>*Dazu musst du natuerlich wissen, wie du aus deinem Datenstrom ein Paket machst. Die Anzahl von 39 Byte reicht da nicht bzgl. Uebertragunsfehler oder Synchronisation nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2233383</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2233383</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 17 Jul 2012 09:04:12 GMT</pubDate></item><item><title><![CDATA[Reply to USB-Serial C++ Timing Probleme on Tue, 17 Jul 2012 17:18:06 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/23152">@fabske</a><br />
Das sieht soweit auf den ersten Blick OK aus ...</p>
<p>Vielleicht funkt dir der Linux-Treiber des USB/RS232 Adapters dazwischen.<br />
Ein USB 2.0 Gerät kann man jede Millisekunde pollen (vielleicht auch schneller, hab den genauen Wert vergessen), d.h. für deine Anwendung sollte das reichen. Ein Jitter von 1-2 ms wäre ja vermutlich kein Beinbruch.</p>
<p>Unter Windows hatte ich mit USB/RS232 Adaptern auf jeden Fall noch kein solches Problem, da waren die Daten immer quasi &quot;sofort&quot; verfügbar (also mit einer Verzögerung &lt; 2ms, was für mich immer vollkommen ausreichend war).</p>
<p>Ich würde die Frage vielleicht eher im Linux Forum stellen.<br />
C++ Problem ist es auf jeden Fall keines, und vermutlich auch kein grundsätzliches Problem mit deinem Code.</p>
<p>Nochwas: mach dir ein kleines Test-Projekt, wo du den ganzen Auswertungs-Code etc. rauswirfst. Nur Lesen von der Schnittstelle + Checksum &amp; Sync prüfen, Erfassung wann was passiert ist (wann wie viel Daten gelesen, war Checksum OK, war Sync OK etc.), und verzögerte Ausgabe. Einerseits um sicherzustellen dass du nicht durch irgendwas anderes Verzögerungen verursachst (z.B. durch die Ausgabe der Debug-Infos, weitere Verarbeitung der Daten - was auch immer). Und andrerseits weil es in so einem Test-Projekt einfacher sein sollte diverse Dinge auszuprobieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2233581</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2233581</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 17 Jul 2012 17:18:06 GMT</pubDate></item></channel></rss>