Seite 1 von 1
readyRead() löst nicht aus wieso?
Verfasst: 19. April 2007 16:05
von Parcivall
Hallo Allerseits!
Ich arbeite gerade an einer Applikation die über die Serielle Schnittstelle Messdaten aufnehmen soll.
In meiner ersten version ist das durch drücken eines receive Buttons geschehen-->
connect(transmitButton, SIGNAL(clicked()), SLOT(transmitMsg()));
QPushButton *receiveButton = new QPushButton("Receive");
daraufhin wird der gelesene Inhalt angezeigt-->
void QespTest::receiveMsg()
{
char buff[1024];
int numBytes;
numBytes = port->bytesAvailable();
if(numBytes > 0)
{
if(numBytes > 1024) numBytes = 1024;
int i = port->read(buff, numBytes);
buff = '\0';
QString msg = buff;
received_msg->append(msg);
received_msg->ensureCursorVisible();
qDebug("bytes available: %d", numBytes);
qDebug("received: %d", i);
qDebug("msg: %d", buff[1]);
qDebug("msg: %d", buff[2]);
}
Ich wollte jetzt mit readyRead() eine art automatische Ausgabe der daten gestallten, leider geht das aber nicht da readyRead() nicht ausgelöst wird weiß einer wieso? Steh total auf dem Schlauch, weil nach meinem Verständnis hätte es so gehen müssen-->
connect (port, SIGNAL (readyRead()), SLOT (receiveMsg()));
Verfasst: 19. April 2007 16:22
von nando
musst du beim connect nicht als 3. parameter das zielobjekt angeben??
etwa so:
Code: Alles auswählen
connect(buttonPtr, SIGNAL(clicked()), targetPtr, SLOT(targetSlot()));
Verfasst: 19. April 2007 16:34
von Parcivall
Also meine Signal Slot eingabe mit
connect(transmitButton, SIGNAL(clicked()), SLOT(transmitMsg()));
hat tadelos funktioniert bis jetzt.
Wenn ich im Debug Modus recieve Button auslöse kann ich es durch gesetzte Breakpoints auch verfolgen..daran dürfte es eigentlich nicht liegen...
Welche weiter eingabe sollte es den sein?
Verfasst: 20. April 2007 07:27
von macman
Parcivall hat geschrieben:Wenn ich im Debug Modus recieve Button auslöse kann ich es durch gesetzte Breakpoints auch verfolgen..daran dürfte es eigentlich nicht liegen...
Hast Du es probiert? Gibt es eine Ausgabe vom connect(..) im Debug Modus? Es sollte nämlich immer ein Empfänger beim connect angegeben werden.
Verfasst: 20. April 2007 07:39
von Christian81
Ggf. ist die verwendete Serialklasse auch nicht so ausgelegt dass sie readyRead() aussenden kann !? So wie ich die öffentliche SerialPort - Klasse kenne, ist das damit nämlich nicht möglich...
Verfasst: 20. April 2007 08:18
von Parcivall
@macman: mein Empfänger ist doch angegeben durch SLOT(recieveMSG()) oder habe ich da etwas falsch verstanden bei der def. von Signal Slot?
(Arbeite noch nicht so wirklich lange an QT-Programmen)
@Christian81: Ich benutze die qextserial 1.0.0 Klasse die ja so weit ich das richtig intepretirt habe vo Qiodevice vererbt worden ist...
also müsste doch readyRead() auch gehen oder

Ich Newbie ich dumme Fragen stellen darf...

Verfasst: 20. April 2007 08:21
von Christian81
Parcivall hat geschrieben:
@Christian81: Ich benutze die qextserial 1.0.0 Klasse die ja so weit ich das richtig intepretirt habe vo Qiodevice vererbt worden ist...
also müsste doch readyRead() auch gehen oder
Nur weil QIODevice dieses Signal senden kann, heisst es noch lange nicht dass es von QExtSerial auch gesendet wird. Und soviel ich weiss macht dies SerialDevice nicht da es nicht so ohne weiteres möglich ist.
Musst wohl oder übel per QTimer alle paar msecs pollen um zu schauen ob neue Daten vorhanden sind.
Verfasst: 20. April 2007 08:39
von Parcivall
Mit Timer habe ich es probiert...
Dieser tut auch..leider bringt er die daten etwas unregelmäsig...
Fällt Dir was anderes ein womit ich das event gesteuert machen könnte?
Mein Ziel ist es regelmäßig Datenpackete von RS232 abzuholen und diese zu speichern, und dies wiederum in einem Thread, so das die "Aufnahme" für sich getrennt abläuft. Die Visualsierung sollte dann auch durch einen Thread erfolgen...
Ich hätte den Producer Consumer Thread dafür ausgewählt da ich denke das es für diese Situation am meisten geeignet ist.
Deshalb habe ich ein wenig scheu vor einem Timer weil ich bedenken habe das es mit Threads passieren könnte das Daten verloren gehen..oder liege ich da auf dem falschen Dampfer?
Vielen vielen Danke für die schnelle Antworten

Verfasst: 20. April 2007 10:14
von macman
Parcivall hat geschrieben:@macman: mein Empfänger ist doch angegeben durch SLOT(recieveMSG())
Damit gibst Du die Funktion an. Wenn diese Funktion aber nun in einer anderen Klasse oder einem anderen Objekt ist, dann musst Du den Empfänger auch angeben. Kann durchaus sein das es ohne geht, so lange Sender und Empfänger zur gleichen Klasse gehören. Hab ich nie probiert.
Verfasst: 20. April 2007 10:39
von Parcivall
Ahaaaaa....
Ok das könnte natürlich sein das es deshalb nicht geht...da durch das vererben gerade readyRead nicht kommt...
Wundert mich nur das keine Fehlermeldung erscheint...
Ich hoffe Du bist jetzt nicht zu sehr geshockt

aber wie gebe ich das genau an von der Syntax her wenn Sender und Empfänger von verschiedenen Klassen sind...?

Verfasst: 20. April 2007 10:46
von nando
aehm.. einfach den pointer nehmen von der sende bzw. empfangsklasse....
oder was meinst du jetzt??
Verfasst: 23. April 2007 11:54
von Parcivall
readyRead() geht definitiv nicht in qextserial...
wer mich vom Gegenteil überzeugen kann nur her damit!
Danke vielmals für Unterstützung!!!
Werde es weiterhin mit einem Timer machen.
Habe vor die gesammten Daten die über serielle Schnittstelle hereinkommen entsprechend zu sortieren und abzulegen mittels Timer.
Das gesammte in einem Producer-Thread...
Mein Consumer-Thread ist dan die Visuallisierung des ganzen...