Problem mit read() Funktion vom QextSerialPort

Alles rund um die Programmierung mit Qt
Antworten
tim09
Beiträge: 2
Registriert: 12. November 2008 23:30

Problem mit read() Funktion vom QextSerialPort

Beitrag 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
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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?
tim09
Beiträge: 2
Registriert: 12. November 2008 23:30

Beitrag 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.
Antworten