Serial Port in QT4

#2289587
Lesenswert?

Hallo!

QT ist für mich absolutes Neuland, also sorry, falls dieses Thema schon 
mal behandelt wurde.
Google mein Freund spuckt auch so einiges aus, wenn man danach sucht, 
aber ich habe Probleme meine COM Schnittstelle am PC mittels QT 
anzusprechen.

Mein Setup:
# Windows 7
# QT SDK (inkl. QT4.7.4 + Qt Creator 2.2.1)

Folgende Tutorials habe ich schon probiert:
http://www.androdna.com/programming/QtTutorial
http://www.webalice.it/fede.tft/serial_port/serial_port.html

Aber nichts davon läuft. Es scheitert schon daran, dass die Sources auf 
meinem System nicht kompilierbar sind.

Hat von euch vielleicht jemand ein Testprogramm, welches bereits mit 
dieser QT Version läuft und mir zur Verfügung stellen kann? 
qextserialport läuft offenbar mit der neuen Version nicht wirklich.


Erklärungen bitte à la "QT4 + Serial Port for Dummies", wie gehabt ist 
noch etwas Neuland...
#2290521
Lesenswert?

Danke für die Links!

QSerialDevice habe ich schon einmal probiert, da werden aber zumindest 2 
Headerdatein nicht gefunden:

Fehler:C1083: Cannot open include file: 
'QtCore/private/qwineventnotifier_p.h': No such file or directory

Fehler:C1083: Cannot open include file: 'ddk/ntddser.h': No such file or 
directory


Bei der SDK die ich installiert habe, sind nur die Libs und die public 
Headers dabei, ergo kann ich es nicht kompilieren.
Habe auch versucht QT mit den Sources zu kompilieren, denn dort würde es 
ja diese Headers geben, zumindest qwineventnotifier_p.h hätte ich schon 
gefunden. Aber auch das ist ohne Fehler nicht möglich...

Schade, dass die Serielle nicht standardmäßig in QT dabei ist.

Hat jemand die Serielle schon mit gleichem Setup zum Laufen gebracht? 
Einfach die Header Datei zu kopieren ist vermutlich nicht die beste 
Lösung.
Gast #2290657
Lesenswert?

Fehler:C1083: Cannot open include file:
'QtCore/private/qwineventnotifier_p.h': No such file or directory

Ja, da scheint es wohl ein Problem mit Qt > 4.7.2 zu geben: 
http://code.google.com/p/qextserialport/issues/detail?id=91

Was ist mit QSerialDevice? Scheint momentan die besser gepflegte 
Variante zu sein.

Bei qtforum.{org|de} schon vorbei gesurft?
#2290729
Lesenswert?

Es geht!!!

Ein kleines Update von mir:

# QT SDK deinstallieren
# MinGW installieren
# QT Source Library 4.7.3 installieren (Installervariante)
# QT Creator 2.2.1 installieren
# QSerialDevice runter laden und entpacken 
(http://qt-apps.org/content/show.php?content=112039)
# BuildLibrary.pro kompilieren (enthalten in QSerialDevice Source)
# BuildExamples.pro kompilieren (enthalten in QSerialDevice Source)
# Das kompilierte Beispiel "writer" starten --> Output mit Oszi oder 
zweitem COM Port überprüfen

Mit der QT SDK geht es definitiv nicht, wie gehabt, hier sind nur die 
Libs und die public Headers dabei. QSerialDevice benötigt aber private 
Headers auch. Das Problem besteht aber laut meiner Recherche erst ab 
Version 4.7. Installiert man die QT Library separat hat man den 
kompletten Source.

Übrigens parallel QT SDK installiert haben ist eine ganz schlechte Idee, 
da kommt er dann mit irgendwelchen Pfaden nicht zusammen, auch wenn man 
den separaten QT Creator verwendet - zumindest war das bei mir so. Mit 
Sicherheit kann man das aber irgendwo unter den Einstellungen 
korrigieren...

Vielen Dank für eure Hilfe!!!!
#2313420
Lesenswert?

Hallo ich habe mich den ganzen Tag abgemüht die Doku zu QT4 
durchzusuchen um das Problem lösen zu können ohne auf die alten stdio's 
zugreifen zu müssen. Des Rätsels Lösung ist "QIODevice". Leider habe ich 
noch nicht herausgefunden, wie ich die Einstellungen der seriellen 
darüber ändern kann (baudrate ...). Hoffentlich könnt ihr mir dabei 
helfen. Wenn ihr die Baudraten von Sender und Empfänger aber vorher 
eingestellt habt ist das hier aber eine ( hoffentlich ) elegante Lösung.



#include <QtCore/QCoreApplication>
#include <QtCore>
#include <QDebug>

void Write()
{
    QFile file("/dev/ttyUSB0");

    if(file.open(QIODevice::WriteOnly | QIODevice::Text))
    {
        QTextStream stream(&file);

        stream << "Hello";
        stream << "World\r\n";

        stream.flush();
        file.close();

    }
}



int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Write();

    return a.exec();
}
#2315589
Lesenswert?

Olaf T. schrieb:
> Des Rätsels Lösung ist "QIODevice".

Nö. Das ist für was anders, und nicht für "IO Devices" am Seriellen 
Port.
=> Doku.

Olaf T. schrieb:
> hier aber eine ( hoffentlich ) elegante Lösung

Nein. Du benutzt den Device-Node einfach wie eine Datei. Klar, 
"Everything's a File", aber die Lösung ist nicht portabel, und, wie du 
schon gemerkt hast: Es fehlt noch einiges.

Deine Lösung entspricht so in etwa einem "COPY DATEI.TXT COM1:" aus 
uralten DOS-Tagen, ohne vorhergehenden MODE-Aufruf.



Fazit: nimm qextserialport, oder schau dir wenigstens dessen Sourcecode 
an.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren