Forum: PC-Programmierung Serial Port in QT4


von Rooney B. (rooney)


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

von Andy (Gast)


Lesenswert?

Guggst Du hier:

http://qt-apps.org/content/show.php?content=112039

oder hier:

http://code.google.com/p/qextserialport/

In den Quellen finden sich auch Testprogramme. Kochrezepte wirst Du 
keine erwarten dürfen - Programmieren hat immer etwas mit Kreativität zu 
tun.

Schon die entsprechenden Tutorials zu Qt durchgearbeitet?

Gruss,
A.

von Rooney B. (rooney)


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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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

Das ist bizarr. Wozu um alles in der Welt benötigt eine Qt-Komponente 
Definitionen aus dem DDK?

von Andy (Gast)


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?

von Rooney B. (rooney)


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!!!!

von kuzulis (Gast)


Lesenswert?

2 Rooney Bob

Download master version hier:

http://gitorious.org/qserialdevice/qserialdevice/archive-tarball/master

Es gibt ein Problem mit "ntddser.h" gelöst.
Aber der Fehler mit "qwineventnotifier_p.h" kann nicht loswerden.
Lösungen: oder Kopie dieses privaten file to QtSDK, oder sammeln Qt von 
der source.

von Olaf T. (charliebrown)


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();
}

von Εrnst B. (ernst)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.
Lade...