<?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[Daten lesen vom Com-Port via Events macht Probleme]]></title><description><![CDATA[<p>Hi,</p>
<p>ich versuche anhand des Beispiels MTTTY von MS ein Programm zu schreiben, welches mit seinen Threads Schreib und Lesezugriffe auf dem Com-Port regelt.</p>
<p>Da ich mit Qt arbeite, verwende ich Qthreads.</p>
<p>Ich bin mir nicht sicher ob ich meine read-funktion richtig implementiert habe. Wäre sehr nett, wenn es jemand überfliegen könnte.</p>
<p>Hier ist mein Einstiegspunkt für den Lese-Thread.<br />
Wenn ich meinen Thread irgendwann beenden will, setze ich von ausserhalb die Variable threadDone auf true.<br />
In jedem Durchlauf wird die read Funktion meiner serial-Klasse aufgerufen.</p>
<pre><code class="language-cpp">void threads::readProc()
{
	threadDone = false;
	while(!threadDone){
	   serialPtr-&gt;read();
	   msleep(50); //wegen busy waiting...
	}
	wait();
}
</code></pre>
<p>Die Read-Funktion meiner serial-klasse.</p>
<pre><code class="language-cpp">bool qserial::read()	 
{
	if(portIsOpen){ //flag wird erst nach Connect auf true gesetzt, damit nicht vorher hier reingegangen wird. (Threads werden schon früher erzeugt)

	   if(osReader.hEvent == NULL || osStatus.hEvent == NULL)
		return false; //die Event-Objekte erzeuge ich im Ctor meiner serial-Klasse

	   if(!fWaitingOnRead){
		 //get the size of data in the com buffer
		LPCOMSTAT lpcs;
		lpcs = (LPCOMSTAT) new BYTE[sizeof(_COMSTAT)];
		if(ClearCommError(hComm,&amp;dwErrors,lpcs)){
			dwBytesToRead = lpcs-&gt;cbInQue; // manchmal zeigt der mir einfach zu wenige Bytes an, obwohl mehr im Com-Buffer sein sollten. Bin ich zu schnell??
			readBuf-&gt;resize(dwBytesToRead); //readBuf ist ein QbyteArray, reserviere hier platz
			readBuf-&gt;fill(0x0); // init mit 0
		}	 

		if(!ReadFile(hComm,(LPVOID)readBuf-&gt;operator const void *(),dwBytesToRead,&amp;dwRead,&amp;osReader)){
					if(!(GetLastError() != ERROR_IO_PENDING))
							fWaitingOnRead = true;
					}else{
					//do sth. with data
						if(dwRead){
							QMutex mutex;
							mutex.lock();
							readJob-&gt;push_back(readBuf-&gt;data()); //Daten kommen manchmal unvollständig an
							readBuf-&gt;clear();
							mutex.unlock();
							emit dataIN();  
						}

					}
		//		}
		//	}

			delete [] lpcs;
		}

		SetCommMask(hComm,dwStoredFlags);

		if(!(fWaitingOnStat)){
			if(!WaitCommEvent(hComm,&amp;dwCommEvent,&amp;osStatus)){
				if(!(GetLastError() != ERROR_IO_PENDING))
					fWaitingOnStat = true;
			}
			//handle status here...	
		}

		if(fWaitingOnRead &amp;&amp; fWaitingOnStat){
			HANDLE hArray[READ_HANDLES];
			hArray[0] = osReader.hEvent;    //read
			hArray[1] = osStatus.hEvent;	 // stat

			dwRes = WaitForMultipleObjects(READ_HANDLES,hArray,false,READ_WAIT_TIMEOUT);

			switch(dwRes){
				//read
				case WAIT_OBJECT_0:
					if(GetOverlappedResult(hComm,&amp;osReader,&amp;dwRead,false)){
						if(dwRead != MAX_READ_BUFFER)
							int xy = 0;	 // read timed out.

						if(dwRead){
							QMutex mutex;
							mutex.lock();
							readJob-&gt;push_back(readBuf-&gt;data()); //falls es zum pending kommt, erwarte ich die daten hier.
							readBuf-&gt;clear();
							mutex.unlock();
							emit dataIN();

						}
					}
						fWaitingOnRead = false;
						break;

				//status
				case WAIT_OBJECT_0 + 1:
					if(GetOverlappedResult(hComm,&amp;osStatus,&amp;dwOvRes,false))
						//handle status here...
						fWaitingOnStat = false;
					break;
				case WAIT_TIMEOUT:
					int x; //nur um breakpoint setzen zu können
					x=0;
					break;

				default:
					break;
			}
		}
	}
	return true;	
}
</code></pre>
<p>Bin mir nicht sicher ob meine Implementierung so richtig ist.<br />
Ich setze mit meinem Programm über das Com-Port (an das Gerät) einen Befehl ab z.B. 0x12. Daraufhin antwortet das Gerät und ich will diese Antwort mit meinem Reader-Thread abfangen.</p>
<p>Jedesmal wenn ich beim debuggen, meinen Befehl absetze bekomme ich von ClearCommError unterschiedliche Anzahl von Bytes die im Com-Puffer auf mich warten.<br />
Wenn es z.B. 2048 Bytes an Daten sein sollte, kommen 5 Bytes an un die restlichen 2043 Bytes werden erst beim nächsten Schleifen-Durchlauf (Thread) gelesen.<br />
Das MTTTY Beispiel scheint richtig zu laufen, meine Implementierung macht mir noch Probleme</p>
<p>Was kann ich hier besser machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/222300/daten-lesen-vom-com-port-via-events-macht-probleme</link><generator>RSS for Node</generator><lastBuildDate>Sun, 12 Apr 2026 18:13:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/222300.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 10 Sep 2008 13:28:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Daten lesen vom Com-Port via Events macht Probleme on Wed, 10 Sep 2008 13:28:27 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich versuche anhand des Beispiels MTTTY von MS ein Programm zu schreiben, welches mit seinen Threads Schreib und Lesezugriffe auf dem Com-Port regelt.</p>
<p>Da ich mit Qt arbeite, verwende ich Qthreads.</p>
<p>Ich bin mir nicht sicher ob ich meine read-funktion richtig implementiert habe. Wäre sehr nett, wenn es jemand überfliegen könnte.</p>
<p>Hier ist mein Einstiegspunkt für den Lese-Thread.<br />
Wenn ich meinen Thread irgendwann beenden will, setze ich von ausserhalb die Variable threadDone auf true.<br />
In jedem Durchlauf wird die read Funktion meiner serial-Klasse aufgerufen.</p>
<pre><code class="language-cpp">void threads::readProc()
{
	threadDone = false;
	while(!threadDone){
	   serialPtr-&gt;read();
	   msleep(50); //wegen busy waiting...
	}
	wait();
}
</code></pre>
<p>Die Read-Funktion meiner serial-klasse.</p>
<pre><code class="language-cpp">bool qserial::read()	 
{
	if(portIsOpen){ //flag wird erst nach Connect auf true gesetzt, damit nicht vorher hier reingegangen wird. (Threads werden schon früher erzeugt)

	   if(osReader.hEvent == NULL || osStatus.hEvent == NULL)
		return false; //die Event-Objekte erzeuge ich im Ctor meiner serial-Klasse

	   if(!fWaitingOnRead){
		 //get the size of data in the com buffer
		LPCOMSTAT lpcs;
		lpcs = (LPCOMSTAT) new BYTE[sizeof(_COMSTAT)];
		if(ClearCommError(hComm,&amp;dwErrors,lpcs)){
			dwBytesToRead = lpcs-&gt;cbInQue; // manchmal zeigt der mir einfach zu wenige Bytes an, obwohl mehr im Com-Buffer sein sollten. Bin ich zu schnell??
			readBuf-&gt;resize(dwBytesToRead); //readBuf ist ein QbyteArray, reserviere hier platz
			readBuf-&gt;fill(0x0); // init mit 0
		}	 

		if(!ReadFile(hComm,(LPVOID)readBuf-&gt;operator const void *(),dwBytesToRead,&amp;dwRead,&amp;osReader)){
					if(!(GetLastError() != ERROR_IO_PENDING))
							fWaitingOnRead = true;
					}else{
					//do sth. with data
						if(dwRead){
							QMutex mutex;
							mutex.lock();
							readJob-&gt;push_back(readBuf-&gt;data()); //Daten kommen manchmal unvollständig an
							readBuf-&gt;clear();
							mutex.unlock();
							emit dataIN();  
						}

					}
		//		}
		//	}

			delete [] lpcs;
		}

		SetCommMask(hComm,dwStoredFlags);

		if(!(fWaitingOnStat)){
			if(!WaitCommEvent(hComm,&amp;dwCommEvent,&amp;osStatus)){
				if(!(GetLastError() != ERROR_IO_PENDING))
					fWaitingOnStat = true;
			}
			//handle status here...	
		}

		if(fWaitingOnRead &amp;&amp; fWaitingOnStat){
			HANDLE hArray[READ_HANDLES];
			hArray[0] = osReader.hEvent;    //read
			hArray[1] = osStatus.hEvent;	 // stat

			dwRes = WaitForMultipleObjects(READ_HANDLES,hArray,false,READ_WAIT_TIMEOUT);

			switch(dwRes){
				//read
				case WAIT_OBJECT_0:
					if(GetOverlappedResult(hComm,&amp;osReader,&amp;dwRead,false)){
						if(dwRead != MAX_READ_BUFFER)
							int xy = 0;	 // read timed out.

						if(dwRead){
							QMutex mutex;
							mutex.lock();
							readJob-&gt;push_back(readBuf-&gt;data()); //falls es zum pending kommt, erwarte ich die daten hier.
							readBuf-&gt;clear();
							mutex.unlock();
							emit dataIN();

						}
					}
						fWaitingOnRead = false;
						break;

				//status
				case WAIT_OBJECT_0 + 1:
					if(GetOverlappedResult(hComm,&amp;osStatus,&amp;dwOvRes,false))
						//handle status here...
						fWaitingOnStat = false;
					break;
				case WAIT_TIMEOUT:
					int x; //nur um breakpoint setzen zu können
					x=0;
					break;

				default:
					break;
			}
		}
	}
	return true;	
}
</code></pre>
<p>Bin mir nicht sicher ob meine Implementierung so richtig ist.<br />
Ich setze mit meinem Programm über das Com-Port (an das Gerät) einen Befehl ab z.B. 0x12. Daraufhin antwortet das Gerät und ich will diese Antwort mit meinem Reader-Thread abfangen.</p>
<p>Jedesmal wenn ich beim debuggen, meinen Befehl absetze bekomme ich von ClearCommError unterschiedliche Anzahl von Bytes die im Com-Puffer auf mich warten.<br />
Wenn es z.B. 2048 Bytes an Daten sein sollte, kommen 5 Bytes an un die restlichen 2043 Bytes werden erst beim nächsten Schleifen-Durchlauf (Thread) gelesen.<br />
Das MTTTY Beispiel scheint richtig zu laufen, meine Implementierung macht mir noch Probleme</p>
<p>Was kann ich hier besser machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1579757</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1579757</guid><dc:creator><![CDATA[donglebob]]></dc:creator><pubDate>Wed, 10 Sep 2008 13:28:27 GMT</pubDate></item><item><title><![CDATA[Reply to Daten lesen vom Com-Port via Events macht Probleme on Tue, 16 Sep 2008 09:48:48 GMT]]></title><description><![CDATA[<p>keiner da? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1582713</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1582713</guid><dc:creator><![CDATA[donglebob]]></dc:creator><pubDate>Tue, 16 Sep 2008 09:48:48 GMT</pubDate></item><item><title><![CDATA[Reply to Daten lesen vom Com-Port via Events macht Probleme on Tue, 16 Sep 2008 12:12:10 GMT]]></title><description><![CDATA[<p>Aktuell habe ich folgendes Problem.<br />
Beim ersten mal klappt mein ReadFile.<br />
Daten kommen an. WEnn ich ein zweites mal Daten anfordere verhält sich Readfile merkwürdig.</p>
<p>Es enthält immernoch die Daten von vorhin im Input-Buffer und hängt die neued Daten einfach ran.</p>
<p>Wie kann ich das verhindern?<br />
Muss ich explizit die Daten nach dem Lesen löschen???, damit sie nicht mehr auftauchen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1582823</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1582823</guid><dc:creator><![CDATA[donglebob]]></dc:creator><pubDate>Tue, 16 Sep 2008 12:12:10 GMT</pubDate></item></channel></rss>