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
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
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.
> 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.
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.
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 :-(
>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
> 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.
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
@ 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?
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).
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.