Der obere Code klappt, der scheinbar identische Code unten klappt nicht. Es ist reiner Debugcode, also nicht "sauber" (File wird nicht geschlossen) und nicht optimiert (ein Zeichen Buffer). Trotzdem entsteht im oberen Beispiel eine Datei, die Zeichen für Zeichen alles aufschreibt, was auf der seriellen Schnittstelle reinkommt.
Code: Alles auswählen
// abstractCommunicationClass stammt von QThread ab!
class serialPort : public abstractCommunicationClass
{
Q_OBJECT
private:
QextSerialPort* comport;
public:
serialPort(); // <-- Initialisierung und Öffnen von comport drin!
~serialPort(); // <-- Schließen des comport
void run();
void testfn();
};
void serialPort::testfn(void)
{
QFile file("serial_debug.txt");
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
return;
QTextStream out(&file);
out << "Starting output\n";
forever
{
// Lesen von Zeichen in den Ringpuffer, wenn notwendig
if (comport->bytesAvailable() > 0)
{
char c;
comport->read(&c, 1); // TODO: Fehlerabfrage
out << c;
out.flush();
}
}
file.close(); // Natürlich wird diese Zeile nie ausgeführt
}
// in der Main dann
serialPort* com = new serialPort();
((serialPort*)(com))->testfn(); // Typcast zur Sicherheit
// Resultat: Klappt
Code: Alles auswählen
// Klasse wie oben
void serialPort::run(void)
{
QFile file("serial.txt");
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
return;
QTextStream out(&file);
out << "Starting output\n";
while (true)
{
// Prüfen, ob Thread beendet werden soll
stoppedLock.lockForRead();
if (stopped)
break;
stoppedLock.unlock();
if (comport->bytesAvailable() > 0) // ist immer falsch -- warum!?
{
char c;
comport->read(&c, 1); // TODO: Fehlerabfrage
out << c;
out.flush();
}
}
file.close();
stoppedLock.unlock();
}
// Aufruf durch
serialPort* com = new serialPort();
((serialPort*)(com))->start(); // Typcast zur Sicherheit
Grüße!