Seite 1 von 1

Problem mit read() Funktion vom QextSerialPort

Verfasst: 13. November 2008 11:42
von tim09
hallo Leute
ich habe mir (unter Windows) ein Thread für die serielle Kommunikation geschrieben. Da habe ich die Funktion von der klasse QextSerialPort verwendet. Die write() Funktion ist ok. Aber die read() Funktion geht nicht.

Hier ist die run() Methode

Code: Alles auswählen

void readthread::run()
{
	char buff[1024] = "";

	int numBytes = 0;
	QString msg = "";
	QString num;

 	for(;;)
  	{
		numBytes = port4read->bytesAvailable();
		num = QString::number(numBytes,10);
		emit printStr(num);

		if(numBytes > 0)
		{
			if(numBytes > 1024) 
            numBytes = 1024;			
         int i = port4read->read(buff,numBytes);
			emit printStr("read ok");
			if(i>0)
			{
				buff[i] = '\0';
				msg = (QString)buff;
				emit printStr(msg);
			}else{
				QString str1 = "read error!";
				emit printStr(str1);
			}

		}else{
			QString str2 = "nothing to read!";
			emit printStr(str2);
		}

		msg = "";
		msleep(100);
		port4read->flush();
  	}

Das Programm blockiert sich wenn er "int i = port4read->read(buff,numBytes);" durchführt. :roll: hat jemand vielleicht erfahrungen damit?

Danke im voraus!
tim

Verfasst: 13. November 2008 12:47
von solarix
zuerst zwei kleinere Dinge:

Wenn i gleich 1024 ist, ueberschreibst du ein Byte zuviel:

Code: Alles auswählen

   int i = port4read->read(buff,numBytes); 
...
 buff[i] = '\0';  // index 1024 ist ausserhalb des Arrays!
besser:

Code: Alles auswählen

   int i = port4read->read(buff,numBytes-1); 
...
 buff[i] = '\0'; 
Dann: der Cast ist ueberfluessig.. (operator=) existiert ja:

Code: Alles auswählen

msg = buff; 
Bei deinem eigentlichen Problem sehe ich keinen offensichtlichen Fehler... ist es evt. ein Problem, dass die Instanz "port4read" nicht dem Thread gehoert? Funktioniert es, wenn du diese Instanz innerhalb des Threads erstellst?

Verfasst: 13. November 2008 15:59
von tim09
hallo solarix
danke für die Antwort. ja, du hast Recht. Die Instanz "port4read" gehört nicht zum Thread. aber ich habe vorher im run() mit "port4read->isOpnen()" geprüft. Die Rückmeldung ist ok. außerdem kann ich "numBytes" lesen.