<?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[Probleme mit SeriellerSchnitstelle]]></title><description><![CDATA[<p>Hi,</p>
<p>ich soll über die COM1 mit einem Geräht kommunizieren. Das Protokoll sieht vor, das befor die kommunikation mit einer bestimmten Geschwindigkeit (z.B. 9600 Baud)gestartet wird TxD eine definierte Zeit auf low und auf high gehen soll (25ms low und 25 ms higt), damit das Geräht die eingehende kommunikation erkennt. Diereckt nach der High impuls folgen dann die Datenbits.</p>
<p>Verwendetes OS: XP</p>
<p>1. Versuch</p>
<p>mitels folgendem code versucht zu realisieren.</p>
<pre><code class="language-cpp">SetCommBreak 
Sleep(25);
ClearCommBreak
Sleep(25);

// weiter mit normaler kommunikation.
</code></pre>
<p>Problem Sleep rundet bei mir immer auf vielfache von 15.5ms auf.</p>
<p>2. Versuch</p>
<p>Bei einer Baudrate von 200Baud und dem übertragen von 0xf0 wirde genau dieser puls generiert ( Start und Stopbits berücksichtigt) Direcht danauch muss aber auf eine andere Baudrate umgeschaltet werden. Und hier fangen meine Probleme an...<br />
nachfolgend ein kleiner auschnitt aus der implementierung</p>
<pre><code class="language-cpp">GetCommState (porth, &amp;PortDCB1); // Port State runterladen für veränderungen
    GetCommState (porth, &amp;PortDCB2); // Port State sichern

    PortDCB1.BaudRate = 200; // neue Baudrate einstellen
    SetCommState (porth, &amp;PortDCB1); // neue Baudrage setzen

    SetCommMask (LOWL_astThreadData[bPortIdentifier].hInterface, EV_TXEMPTY);

    // Wackeup senden
    WriteFile (porth,                       // Port handle
               &amp;wackeUp,                    // Pointer to the data to write 
               (DWORD)length_write,         // Number of bytes to write
               &amp;length_writen,              // Pointer to the number of bytes written
               NULL);                       // Must be NULL for Windows CE

    events = EV_TXEMPTY;
    WaitCommEvent (porth,&amp;events,NULL);     // Warten bis wackeup gesendet wurde.

    // Protokoll daten übertragen
    WriteFile (porth,                       // Port handle
               &amp;data,                       // Pointer to the data to write 
               (DWORD)dlength_write,        // Number of bytes to write
               &amp;dlength_writen,             // Pointer to the number of bytes written
               NULL);                       // Must be NULL for Windows CE

    // Warten bis die übertragung beginnt 
    WaitCommEvent (porth,&amp;events,NULL);
    // Orginal baudrate für die übertragung wieder herstellen
    // Wieso das erst nach dem wait gemacht werden muss ist mir etwas schleiderhaft aber so 
    // funktionierts bisher am besten.
    SetCommState (porth, &amp;PortDCB2);
</code></pre>
<p>so und nun meine Probleme. Soweit sieht auch alles gut aus. nur das timig stimmt nicht. Start bit und datenbits wirden des WackUp impulses werden mit 200Baud übertragen. Soweit OK. das StopBit Aber wird durch die Letzte umschaltung mit der neuen Baudrate übertreagen. ( wers nicht glaubt solls selber ausprobieren , ich hab hier ein oscar neben mir stehen der mir die zeiten simlich exakt angibt. ) er rest wird dann weiter mit 9600 übertragen.</p>
<p>Das Problem scheint WaitCommEvent zu machen. Bei EV_TXEMPTY Steht zwar in der MSDN &quot;The last character in the output buffer was sent.&quot; drinn. nur scheint das nicht zu bedeuten, das auch das stop bit gesendet wurde. grrrrr.</p>
<p>Weiter überschreibt SetCommState die einstellungen des ports auch wenn bereits daten gesendet werden. Dadurch werden z.b. die ersen bits langsam und die lezten schnell übertragen.</p>
<p>Villeicht kennt jamand ja eine lösung für das problem. Lösungsansatz 1 hab ich bisher nicht weiterverfolgt, nachdem das sleep so verrücktgespielt hat. die 2. seiht bisher recht vielversprechend aus. nur vehlen mir noch 4ms beim high impuls.</p>
<p>gruss Termite</p>
<p>PS. ich krigt hier lansam einen kleinen hass auf m$</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/74335/probleme-mit-seriellerschnitstelle</link><generator>RSS for Node</generator><lastBuildDate>Fri, 10 Apr 2026 22:00:56 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/74335.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 19 May 2004 13:28:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme mit SeriellerSchnitstelle on Wed, 19 May 2004 13:28:26 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich soll über die COM1 mit einem Geräht kommunizieren. Das Protokoll sieht vor, das befor die kommunikation mit einer bestimmten Geschwindigkeit (z.B. 9600 Baud)gestartet wird TxD eine definierte Zeit auf low und auf high gehen soll (25ms low und 25 ms higt), damit das Geräht die eingehende kommunikation erkennt. Diereckt nach der High impuls folgen dann die Datenbits.</p>
<p>Verwendetes OS: XP</p>
<p>1. Versuch</p>
<p>mitels folgendem code versucht zu realisieren.</p>
<pre><code class="language-cpp">SetCommBreak 
Sleep(25);
ClearCommBreak
Sleep(25);

// weiter mit normaler kommunikation.
</code></pre>
<p>Problem Sleep rundet bei mir immer auf vielfache von 15.5ms auf.</p>
<p>2. Versuch</p>
<p>Bei einer Baudrate von 200Baud und dem übertragen von 0xf0 wirde genau dieser puls generiert ( Start und Stopbits berücksichtigt) Direcht danauch muss aber auf eine andere Baudrate umgeschaltet werden. Und hier fangen meine Probleme an...<br />
nachfolgend ein kleiner auschnitt aus der implementierung</p>
<pre><code class="language-cpp">GetCommState (porth, &amp;PortDCB1); // Port State runterladen für veränderungen
    GetCommState (porth, &amp;PortDCB2); // Port State sichern

    PortDCB1.BaudRate = 200; // neue Baudrate einstellen
    SetCommState (porth, &amp;PortDCB1); // neue Baudrage setzen

    SetCommMask (LOWL_astThreadData[bPortIdentifier].hInterface, EV_TXEMPTY);

    // Wackeup senden
    WriteFile (porth,                       // Port handle
               &amp;wackeUp,                    // Pointer to the data to write 
               (DWORD)length_write,         // Number of bytes to write
               &amp;length_writen,              // Pointer to the number of bytes written
               NULL);                       // Must be NULL for Windows CE

    events = EV_TXEMPTY;
    WaitCommEvent (porth,&amp;events,NULL);     // Warten bis wackeup gesendet wurde.

    // Protokoll daten übertragen
    WriteFile (porth,                       // Port handle
               &amp;data,                       // Pointer to the data to write 
               (DWORD)dlength_write,        // Number of bytes to write
               &amp;dlength_writen,             // Pointer to the number of bytes written
               NULL);                       // Must be NULL for Windows CE

    // Warten bis die übertragung beginnt 
    WaitCommEvent (porth,&amp;events,NULL);
    // Orginal baudrate für die übertragung wieder herstellen
    // Wieso das erst nach dem wait gemacht werden muss ist mir etwas schleiderhaft aber so 
    // funktionierts bisher am besten.
    SetCommState (porth, &amp;PortDCB2);
</code></pre>
<p>so und nun meine Probleme. Soweit sieht auch alles gut aus. nur das timig stimmt nicht. Start bit und datenbits wirden des WackUp impulses werden mit 200Baud übertragen. Soweit OK. das StopBit Aber wird durch die Letzte umschaltung mit der neuen Baudrate übertreagen. ( wers nicht glaubt solls selber ausprobieren , ich hab hier ein oscar neben mir stehen der mir die zeiten simlich exakt angibt. ) er rest wird dann weiter mit 9600 übertragen.</p>
<p>Das Problem scheint WaitCommEvent zu machen. Bei EV_TXEMPTY Steht zwar in der MSDN &quot;The last character in the output buffer was sent.&quot; drinn. nur scheint das nicht zu bedeuten, das auch das stop bit gesendet wurde. grrrrr.</p>
<p>Weiter überschreibt SetCommState die einstellungen des ports auch wenn bereits daten gesendet werden. Dadurch werden z.b. die ersen bits langsam und die lezten schnell übertragen.</p>
<p>Villeicht kennt jamand ja eine lösung für das problem. Lösungsansatz 1 hab ich bisher nicht weiterverfolgt, nachdem das sleep so verrücktgespielt hat. die 2. seiht bisher recht vielversprechend aus. nur vehlen mir noch 4ms beim high impuls.</p>
<p>gruss Termite</p>
<p>PS. ich krigt hier lansam einen kleinen hass auf m$</p>
]]></description><link>https://www.c-plusplus.net/forum/post/523443</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/523443</guid><dc:creator><![CDATA[Termite]]></dc:creator><pubDate>Wed, 19 May 2004 13:28:26 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit SeriellerSchnitstelle on Wed, 19 May 2004 16:52:58 GMT]]></title><description><![CDATA[<p>Hi</p>
<p>hab das problem soweit in den griff gekriegt. Sende an stelle von 8 bits für den WackUp impuls nur 7 (0x78). Mit dem Start bit sind das dann 8 bit die mit einer entsprechenden Baudrate ( 160 Baud ) gesendet werden. Das Stopbit das dan noch übrichbleibt und mit 9600 Baud übertragen wird kann ich hoffentlich vernachlässigen.</p>
<p>aber nu is wochenende</p>
<p>Termite</p>
]]></description><link>https://www.c-plusplus.net/forum/post/523586</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/523586</guid><dc:creator><![CDATA[Termite_]]></dc:creator><pubDate>Wed, 19 May 2004 16:52:58 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit SeriellerSchnitstelle on Wed, 19 May 2004 16:54:49 GMT]]></title><description><![CDATA[<p>Könnt ich bitte den ganzen Code haben?<br />
Ich wollte schon immer mal Strom über Com leiten, hab aber nie richitg hinbekommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/523588</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/523588</guid><dc:creator><![CDATA[INTEGER]]></dc:creator><pubDate>Wed, 19 May 2004 16:54:49 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit SeriellerSchnitstelle on Wed, 19 May 2004 21:50:58 GMT]]></title><description><![CDATA[<p>Hi</p>
<p>ist hir im speziellen fall etwas komplizierter da sich da noch ein protokoll drum herum befindet und das ganze noch in einer dll verpackt wurde. Ich hab auch nicht alles selber implementiert und hab gerade keinen zugriff drauf. ( wochenende )</p>
<p>Hier im Forum sind noch einge Threads zu dem Thema die mir auch ein bischen weitergeholfen haben. einfach mal die such funktion anschmeissen.</p>
<p>im prinzip geht das wie bei einer Datei</p>
<p>CreateFile<br />
WriteFile<br />
ReadFile</p>
<p>und zusätzlich gibts noch einie funktionen speziell für die Schnitstelle.</p>
<p>// generieren der DCB Struckturen aus Strings<br />
BuildCommDCB<br />
BuildCommDCBAndTimeouts</p>
<p>// Comm configureiren<br />
GetCommState // Einstellungen der Schnistelle setzen und erfragen<br />
SetCommState</p>
<p>GetCommTimeout // Timeouts setzen und aktuelle gesetzte Werte erfragen<br />
SetCommTimeout</p>
<p>GetCommMask // Eventmaske erfragen uns setzen<br />
SetCommMask</p>
<p>GetCommConfig<br />
SetCommConfig<br />
SetDefaultCommConfig</p>
<p>ClearCommBreak // TXD auf definirten pegel setzen<br />
SetCommBreak</p>
<p>ClearCommError</p>
<p>WaitCommEvent // Auf einen Ereignis der Comm Schnitstelle warten</p>
<p>CommConfigDialog</p>
<p>Sieht jetzt viel aus. normalerweise wird aber nicht alles gebraucht. und meistens nur zur initallisierung.</p>
<p>also wie gesagt entweider mal hier im Forum suchen oder mal googel anschmeissen oder in der MSDN nachschauen was die funktionen bedeuten</p>
<p>gruss Termite</p>
]]></description><link>https://www.c-plusplus.net/forum/post/523732</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/523732</guid><dc:creator><![CDATA[Termite_]]></dc:creator><pubDate>Wed, 19 May 2004 21:50:58 GMT</pubDate></item></channel></rss>