<?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[Frequenz über Eingang der RS232 einlesen]]></title><description><![CDATA[<p>Hi!<br />
Ich brauche Hilfe. Ich möchte gerne eine Frequenz, die von einem<br />
Inkrementalgeber erzeugt wird, über einen Eingang der RS232<br />
einlesen. Ich habe es zwar schon so versucht, aber die Genauigkeit<br />
lässt hier schwer zu wünschen übrig:</p>
<pre><code class="language-cpp">GetCommModemStatus(hCom, &amp;COMStatus); 

	if (COMStatus == MS_RING_ON)
	{
		while (COMStatus &amp; MS_RING_ON) {GetCommModemStatus(hCom, &amp;COMStatus);}
		begin = read_time();
		while (!(COMStatus &amp; MS_RING_ON)) {GetCommModemStatus(hCom, &amp;COMStatus);}
		end = read_time();
	}
	else
	{
		while (!(COMStatus &amp; MS_RING_ON)) {GetCommModemStatus(hCom, &amp;COMStatus);}
		begin = read_time();
		while (COMStatus &amp; MS_RING_ON) {GetCommModemStatus(hCom, &amp;COMStatus);}
		end = read_time();
	}
</code></pre>
<p>Windows ist kein Echzeitbetriebssystem, das ist schon klar, aber irgendwie<br />
muss es doch möglich sein, die Frequenzen sauber einlesen zu können.<br />
Danke schon mal.<br />
mfg fritze</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/156621/frequenz-über-eingang-der-rs232-einlesen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 22 Jul 2026 23:34:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/156621.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 18 Aug 2006 09:52:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frequenz über Eingang der RS232 einlesen on Fri, 18 Aug 2006 09:52:18 GMT]]></title><description><![CDATA[<p>Hi!<br />
Ich brauche Hilfe. Ich möchte gerne eine Frequenz, die von einem<br />
Inkrementalgeber erzeugt wird, über einen Eingang der RS232<br />
einlesen. Ich habe es zwar schon so versucht, aber die Genauigkeit<br />
lässt hier schwer zu wünschen übrig:</p>
<pre><code class="language-cpp">GetCommModemStatus(hCom, &amp;COMStatus); 

	if (COMStatus == MS_RING_ON)
	{
		while (COMStatus &amp; MS_RING_ON) {GetCommModemStatus(hCom, &amp;COMStatus);}
		begin = read_time();
		while (!(COMStatus &amp; MS_RING_ON)) {GetCommModemStatus(hCom, &amp;COMStatus);}
		end = read_time();
	}
	else
	{
		while (!(COMStatus &amp; MS_RING_ON)) {GetCommModemStatus(hCom, &amp;COMStatus);}
		begin = read_time();
		while (COMStatus &amp; MS_RING_ON) {GetCommModemStatus(hCom, &amp;COMStatus);}
		end = read_time();
	}
</code></pre>
<p>Windows ist kein Echzeitbetriebssystem, das ist schon klar, aber irgendwie<br />
muss es doch möglich sein, die Frequenzen sauber einlesen zu können.<br />
Danke schon mal.<br />
mfg fritze</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1119693</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1119693</guid><dc:creator><![CDATA[fritze]]></dc:creator><pubDate>Fri, 18 Aug 2006 09:52:18 GMT</pubDate></item><item><title><![CDATA[Reply to Frequenz über Eingang der RS232 einlesen on Fri, 18 Aug 2006 10:11:55 GMT]]></title><description><![CDATA[<p>Meinst Du sowas?</p>
<pre><code>CTS_ON : 3744724586 µs
DSR_ON : 3744724586 µs
DSR_OFF: 3744724857 µs
CTS_OFF: 3744724937 µs
CTS_ON : 3744725028 µs
CTS_OFF: 3744726955 µs
DSR_ON : 3744727030 µs
CTS_ON : 3744727100 µs
CTS_OFF: 3744728906 µs
CTS_ON : 3744728986 µs
CTS_OFF: 3744730860 µs
CTS_ON : 3744730939 µs
CTS_OFF: 3744732821 µs
CTS_ON : 3744732903 µs
</code></pre>
<p>Wie hoch sind denn die Frequenzen?</p>
<p>Blackbird</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1119716</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1119716</guid><dc:creator><![CDATA[*Blackbird*]]></dc:creator><pubDate>Fri, 18 Aug 2006 10:11:55 GMT</pubDate></item><item><title><![CDATA[Reply to Frequenz über Eingang der RS232 einlesen on Fri, 18 Aug 2006 10:20:04 GMT]]></title><description><![CDATA[<p>kannst es so machen:<br />
ein Thread erfasst alle Pegelaenderungen an der COM und sendet sie mit einem TimeStamp an einen anderen Thread der sie auswertet, speichert, ...</p>
<p>Hier sind Ausschnitte aus den Threads, die das Prinzip zeigen (hab' jetzt keine Lust, das Ueberfluessige rauszustreichen).<br />
COMThread:</p>
<pre><code class="language-cpp">...

	// Auf Events warten:
	while (!pparams-&gt;ThreadStoppen) // solange weitermachen bis TRUE
	{
		WaitCommEvent (hCom, &amp;dwEvtMask, &amp;o);  // EventMask &quot;scharf machen&quot;
		// kommt der Event, ist auch die dwEvtMask geladen und es kann weitergehen
		if (WAIT_OBJECT_0 == WaitForSingleObject (o.hEvent, INFINITE)) // warten bis Event
		{
			lTime = queryPrecisionTimeStamp ();  // Zeit holen
			// Message senden. In dwEvtMask können mehrere Ereignisse gesetzt sein
			bRet = PostThreadMessage (dwMonitorThreadId, (QS_ALLPOSTMESSAGE + MSG_TIME), 
					(WPARAM)dwEvtMask , (LPARAM)lTime);
		}    // end of: if (WAIT_OBJECT_0 == ...
	}      // end of: while (...
...
</code></pre>
<p>MonitorThread:</p>
<pre><code class="language-cpp">...
	// create a queue for the thread
	PeekMessage ((LPMSG)&amp;msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);
	// sent event after queue creation back to the threads creator
	bRet = SetEvent (hEvent);

	printf (&quot;\r\nMonitorThread: warte auf Events ...&quot;);

	// get messages by message from threads local queue
	while ((bRet = GetMessage (&amp;msg, NULL, 0, 0)) != 0)
	{
		if (bRet == -1)
		{ // handle the error and possibly exit
			MessageBox (NULL, &quot;MonitorThread: GetMessage error&quot;, &quot;COM Port:&quot;, MB_OK | MB_ICONSTOP);
			return NULL;  // error!
		}
		else  
		{ // a valid message is received
			switch (msg.message)
			{
			case (QS_ALLPOSTMESSAGE + MSG_COMOPEN):
				printf (&quot;\r\nMonitorThread: MSG_COMOPEN: lParam=0x%08x wParam=0x%08x&quot;, 
					msg.lParam, msg.wParam);
				break;

			case (QS_ALLPOSTMESSAGE + MSG_COMCLOSE):
				printf (&quot;\r\nMonitorThread: MSG_COMCLOSE: lParam=0x%08x wParam=0x%08x&quot;, 
					msg.lParam, msg.wParam);
				break;

			case (QS_ALLPOSTMESSAGE + MSG_TIME):
				// Time stamp message: lParam=time, wParam=dwEvtMask
				szMsg[0] = '\0';

				if (DWORD(msg.wParam) &amp; EV_CTS)
				{
					GetCommModemStatus (hCom, &amp;COMStatus);
					if (COMStatus &amp; MS_CTS_ON)
					{ // CTS (Pin8) activated
						wsprintf (szMsgTmp, &quot;\r\nCTS_ON : %lu µs&quot;, msg.lParam);
					}
					else
					{ // CTS (Pin8) deactivated
						wsprintf (szMsgTmp, &quot;\r\nCTS_OFF: %lu µs&quot;, msg.lParam);
					}
					Ccts.WriteSaveFile (szMsgTmp, strlen (szMsgTmp));
					Call.WriteSaveFile (szMsgTmp, strlen (szMsgTmp));
					strcat (szMsg, szMsgTmp);
				}

				if (DWORD(msg.wParam) &amp; EV_DSR)
				{
					GetCommModemStatus (hCom, &amp;COMStatus);
					if (COMStatus &amp; MS_DSR_ON)
					{ // DSR (Pin6) activated
						wsprintf (szMsgTmp, &quot;\r\nDSR_ON : %lu µs&quot;, msg.lParam);
					}
					else
					{ // DSR (Pin6) deactivated
						wsprintf (szMsgTmp, &quot;\r\nDSR_OFF: %lu µs&quot;, msg.lParam);
					}
					Cdsr.WriteSaveFile (szMsgTmp, strlen (szMsgTmp));
					Call.WriteSaveFile (szMsgTmp, strlen (szMsgTmp));
					strcat (szMsg, szMsgTmp);
				}
...
</code></pre>
<p>Damit habe ich die Liste im Post weiter oben erstellt.</p>
<p>Blackbird</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1119724</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1119724</guid><dc:creator><![CDATA[*Blackbird*]]></dc:creator><pubDate>Fri, 18 Aug 2006 10:20:04 GMT</pubDate></item><item><title><![CDATA[Reply to Frequenz über Eingang der RS232 einlesen on Mon, 21 Aug 2006 10:22:25 GMT]]></title><description><![CDATA[<p>Hey!<br />
Hab das jetzt so gemacht, und es funktioniert!<br />
DANKE für die Hilfe!!!<br />
mfg fritze</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1121362</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1121362</guid><dc:creator><![CDATA[fritze]]></dc:creator><pubDate>Mon, 21 Aug 2006 10:22:25 GMT</pubDate></item><item><title><![CDATA[Reply to Frequenz über Eingang der RS232 einlesen on Wed, 23 Aug 2006 10:15:40 GMT]]></title><description><![CDATA[<p>Hey blackbird!<br />
Ich bräuchte nochmals deine Hilfe!<br />
Es geht um folgendes:<br />
Der Inkrementalgeber (Hengstler RI32) erzeugt Frequenzen und sendet<br />
diese über zwei Kanäle. Kanal A und Kanal B.<br />
Kanal A habe ich mit dem Eingang DCD der RS232 verbunden.<br />
Kanal B habe ich mit dem Eingang RI der RS232 verbunden.<br />
Beim Eingang DCD bekomm ich schöne Frequenzen, egal welcher<br />
Kanal angeschlossen ist. Nur beim Eingang RI geht gar nix oder fast<br />
gar nix, obwohl ich ihn beim monitoring gleich behandle wie DCD.</p>
<p>Ich habe mal einen Testlauf gemacht um dir das zu veranschaulichen:<br />
Inkrementalgeber dreht sich gleichmäßig für fünf Sekunden nach rechts und müsste 125 Hz liefern. Beim diesem Testlauf habe ich berechnet wie oft<br />
sich der Status auf den Eingängen DCD und RI ändert, und wie oft die<br />
jeweiligen Eingänge 1 oder 0 bekommen.</p>
<pre><code>state_changed_counter_DCD: 624
state_changed_counter_RI: 623

DCD_ON:  312
DCD_OFF: 312

RI_ON:   0
RI_OFF:  623
</code></pre>
<p>Die Frequenzen die der Inkrementalgeber erzeugt sind völlig in Ordnung,<br />
da ich sie mit dem Oszi mehrmals gemessen habe.</p>
<p>Ich weiß das ist jetzt viel auf einmal, aber ich weiß echt nicht mehr<br />
weiter.</p>
<p>Danke schonmal<br />
mfg fritze</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1122690</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1122690</guid><dc:creator><![CDATA[fritze]]></dc:creator><pubDate>Wed, 23 Aug 2006 10:15:40 GMT</pubDate></item></channel></rss>