Forum: PC-Programmierung Beispielprogramm RS232 mit Qt (win)


von HitMe (Gast)


Lesenswert?

Hat jemand zufällig ein Beispielprogramm oder Link wie man unter
Windows und Qt (4.5 oder auch älter) auf die serielle Schnittstelle 
zugreifen kann?

Qextserialport kenn ich inzwischen; ich meine ein konkretes, 
funktionsfähiges kleines Programm.

Würde mir sehr helfen.

Thanks...

HitMe

von Northernhessian (Gast)


Lesenswert?

Hi, HitMe
guckst Du hier:
http://www.chuktech.net/serial/serTest.tgz
Gruß
Northernhessian

von nex (Gast)


Lesenswert?

Hi,

Bin noch neu in Qt und C++.

Und wollte das Beispielporgramm Übersetzen, bekomme allerdings eine 
Fehlermeldung:

/src/SerialWidget.cpp:54: error: no matching function for call to 
`QextSerialPort::open()'

Die QectSerial Dateien habe ich soweit schon eingefügt.
Wo könnte mein Fehler liegen?

Thx,

Gruß nex

von nex (Gast)


Lesenswert?

Hi,
kenn mich wie gesagt nicht sonderlich mit c++ und Qt aus, habe aber 
trotzdem versucht ein bischen was zu fixen.

1. habe ich in der SerialWidget.cpp in zeile 166 den Außdruck
 if ( file.open() )
zu
 if ( file.open(QIODevice::ReadOnly) )
geändert.

2. meckert der Compiler dass die beiden Variablen
           virtual qint64 bytesToWrite() const;
           virtual qint64 writeData(const char *data, qint64 maxSize);

   protected sind, habe sie daher kurzerhand auf public gesetzt.

Jetzt kommt der schöne Fehler :-1: error: collect2: ld returned 1 exit 
status

Solangsam glaube ich das mit der Qextserialport ist alles nur eine 
rießen Lüge ähnlich wie die Mondlandung nur halt wirklich.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> 2. meckert der Compiler dass die beiden Variablen
>           virtual qint64 bytesToWrite() const;
>           virtual qint64 writeData(const char *data, qint64 maxSize);
>   protected sind, habe sie daher kurzerhand auf public gesetzt.

Das sind keine Variablen.

> Solangsam glaube ich das mit der Qextserialport ist alles nur eine
> rießen Lüge ähnlich wie die Mondlandung nur halt wirklich.

So langsam sollte Dir klar werden, daß C++-Programmierung nur 
funktioniert, wenn man auch C++-Programmierung versteht.
Einfach irgendwo "was fixen" setzt Wissen und Verständnis voraus, sonst 
geht das wie bei Dir in die Hose.

Im übrigen lässt Deine Rechtschreibung stark zu wünschen übrig; wenn Du 
C- oder C++-Syntax mit ähnlicher "Lockerheit" schreibst, sind 
Fehlermeldungen des Compilers überhaupt kein Wunder.

von nex (Gast)


Lesenswert?

Hi,

muss mich für meine Rechtschreibung entschuldigen, ;-) und versuche 
nochmal das Ganze sachlicher auszudrücken. Ich hoffe es passt dann noch 
vom Thema zum Beitrag.

Ich versuche gerade ein Programm zu entwickeln, welches Informationen 
über die Serielle Schnittstelle bekommt. In vielen Foren wird hier auf 
QextSerialPort verwiesen, da ich sowieso mit Qt arbeite, klingt das auch 
logisch.

Da ich aber wie Jeder unerfahren anfange, wollte ich anhand eines 
kleinen Beispiels die Grundfunktionen der QextSerialPort kennenlernen. 
Das Programm bringt allerdings die bereits genannten Fehlermeldungen. 
Nun würde ich gerne wissen, ob das Programm allgemein korrekt 
funktioniert. (wovon ich eigentlich ausgehe).?

Dann würde dies bedeuten, dass meine Implementierung der QextSerialPort 
fehlerhaft ist.

Es war wohl naiv zu glauben ich könnte einfach die Source und 
Headerdateien einfügen. Daher stellt sich nun die Frage wie ich die 
QextSerialPort richtig unter Windows installiere. Gibt es dazu eine 
Anleitung? (google gab bisher nichts aussagekräftiges)

Und zu meinem letzten Problem, die Zielapplikation soll auf Embedded 
Linux laufen. Bisher war dies durch die plattformübergreifende 
Programmierung von Qt kein Problem, nun habe ich bei meiner Recherche 
festgestellt, dass QextSerialPort in Windows und Linux völlig 
verschieden implementiert wird. Lohnt sich dann der Aufwand das ganze 
erst unter Windows zu entwickeln?


Über eine Antwort würde ich mich sehr freuen,
Gruß nex

PS:
Sorry für die Länge des Beitrags, aber ich hoffe ich kann damit meine 
vorherige chaotische Aussagen wieder gut machen.

von Mark B. (markbrandis)


Lesenswert?

nex schrieb:
> 2. meckert der Compiler dass die beiden Variablen
>            virtual qint64 bytesToWrite() const;
>            virtual qint64 writeData(const char *data, qint64 maxSize);
>
>    protected sind, habe sie daher kurzerhand auf public gesetzt.

Hab ich auch gemacht, dann kompiliert der Code zumindest mal.

> Jetzt kommt der schöne Fehler :-1: error: collect2: ld returned 1 exit
> status

Der Linker findet die Library qextserialport nicht (bei mir unter Win 
XP):

C:\Programme\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\mingw32\bin\ 
ld.exe:  cannot find -lqextserialport

Die muss man erstmal erstellen (mit qmake und mingw32-make), das hat bei 
mir auch geklappt. libqextserialport.a heißt dann die erzeugte Datei. 
Nun kommt's: Egal wie ich versuche sie einzubinden und den Pfad zu 
setzen und was weiß ich, der Linker findet sie immer noch nicht. Zu 
Hülf! Es ist spät und ich bin müde :-(

von Gast4 (Gast)


Lesenswert?

>verschieden implementiert wird. Lohnt sich dann der Aufwand das ganze
>erst unter Windows zu entwickeln?

Es lohnt um Erfahrung zu sammeln.
Es lohnt nicht um das Problem zu loesen.

Gast4

von Rolf Magnus (Gast)


Lesenswert?

> Und zu meinem letzten Problem, die Zielapplikation soll auf
> Embedded Linux laufen. Bisher war dies durch die
> plattformübergreifende Programmierung von Qt kein Problem, nun
> habe ich bei meiner Recherche festgestellt, dass QextSerialPort in
> Windows und Linux völlig verschieden implementiert wird.

Implementiert natürlich, genauso eben wie Qt selbst. Verwendet wird 
sie aber gleich. (bis auf die Namen der Ports) Das ist ja gerade der 
Witz dran.

> libqextserialport.a heißt dann die erzeugte Datei.
> Nun kommt's: Egal wie ich versuche sie einzubinden und den Pfad zu
> setzen und was weiß ich, der Linker findet sie immer noch nicht. Zu
> Hülf! Es ist spät und ich bin müde :-(

Der Linker-Kommandozeile ein -L<pfad> hinzufügen, wobei <pfad> für das 
Verzeichnis steht, in dem die libqextserialport.a liegt.

von Christoph (Gast)


Lesenswert?

Hallo zusammen,

Ich habe die QextSerialPort Lib auch mal ausprobiert und bin nicht 
besonders begeistert.
Lesen vom Com Port funzt gut. Nur beim Schreiben auf den Com Port gibt 
es Probleme. Ich verwende den FT232RL zur Kommunikation mit einem 
ATmega64.  Der ATmega reagiert nur sporadisch auf die übermittelten 
Befehle. Ein Test mit Putty als auch mit einem eigenen Programm zur 
COM-Kommunikation, welches ich in C# geschrieben habe zeigt allerdings 
die volle Funktion.
Hat jemand ein ähnliches Verhalten festgestellt?

Beste Grüße, Christoph

von Rolf Magnus (Gast)


Lesenswert?

Bei mir hat es eigentlich gut funktioniert.

von pcb (Gast)


Lesenswert?

@ Christoph
>Ein Test mit Putty als auch mit einem eigenen Programm zur
>COM-Kommunikation, welches ich in C# geschrieben habe zeigt allerdings
>die volle Funktion.

was hast du den getestet das QtProgramm oder (die Kommunikation mit) 
ATmega64?

Das Portsniffer Program "Portmon" von Microsoft kennst du schon?

von R. W. (rickw)


Lesenswert?

Hat es jemand auch mal unter Linux getestet? Abgesehen davon, dass die 
POSIX-Implementierung der für Windows hinterherhinkt, gibt writeData() 
an einen per USB angebundenem FT232 nichts aus. Das Einlesen 
funktioniert dagegen wunderbar (eventbasiert).

von stefan (Gast)


Angehängte Dateien:

Lesenswert?

Hallo R.W.

gerade eben habe ich ein kleines Testprogramm für qextserial 
ausprobiert.
Das Abfragen der Daten vom seriellen Port ist dort allerdings mit einem 
"SIGNAL" von einem 1Sekunden Timer gelöst.
Kannst Du mir sagen, wie der Code für ein "SIGNAL" direkt vom RX 
aussehen muss?

Gruß,
stefan

von kuzulis (Gast)


Lesenswert?

2  stefan ,

Versuchen Sie QSerialDevice!

SVN: http://fireforge.net/snapshots.php?group_id=199

Es befindet sich im Verzeichnis /examples Beispiel /sreader, die das 
Datensignal lautet readyRead


PS: Wenn ich Sie richtig verstehe

von R.W. (Gast)


Lesenswert?

Hallo Stefan,

1
// Der Slot heißt bei mir void dataReady()
2
connect(&device, SIGNAL(readyRead()), this, SLOT(dataReady()), Qt::QueuedConnection);
3
4
// Slot
5
void Serial::dataReady() {
6
        QByteArray data = device.readAll();
7
        ...
8
}
9
10
// Initialisieren und Öffnen der Schnittstelle
11
// config ist eine von PortSettings abgeleitete Klasse
12
device.setBaudRate(config->BaudRate);
13
device.setDataBits(config->DataBits);
14
device.setParity(config->Parity);
15
device.setStopBits(config->StopBits);
16
device.setFlowControl(config->FlowControl);
17
device.setTimeout(config->Timeout_Millisec);
18
19
20
device.setQueryMode(QextSerialPort::EventDriven);
21
device.setPortName(port);
22
23
device.open(QIODevice::ReadWrite);

Wenn du große Nachrichten verschickst, kommen sie in Stückchen mit 
mehreren Signalen hintereinander. Du musst die empfangenen Daten also 
zwischenspeichern und nach und nach zusammenbauen.

Was bei mir dazu geführt hat, dass nichts ausgegeben wurde, war, dass 
strandardmäßig FlowControl eingeschalten ist. Ich habs in meinen 
Standardeinstellungen dann ausgeschalten.

Richard

von stefan (Gast)


Lesenswert?

Vielen Dank für eure schnellen Antworten.

>Was bei mir dazu geführt hat, dass nichts ausgegeben wurde, war, dass
>strandardmäßig FlowControl eingeschalten ist.

So was in der Art ist mir gestern Abend auch noch zu dem Problem 
eingefallen: Ich hatte ein Programm in Java mit der Library für die 
serielle Schnittstelle "rxtx"
http://rxtx.qbang.org/wiki/index.php/Main_Page
geschrieben. Zwischen Linux und Windows war das Verhalten auch 
unterschiedlich. Ich habe ewig gebraucht um den Fehler zu finden. 
Letzendlich war es dann auch die FlowControl. Das Problem der 
unterschiedlichen Initialisierung scheint also eine Schicht tiefer zu 
liegen.

Gruß,
Stefan

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.