RS232 auslesen

Alles rund um die Programmierung mit Qt
Antworten
Mr.Crank
Beiträge: 38
Registriert: 16. April 2013 15:21

RS232 auslesen

Beitrag von Mr.Crank »

Moin zusammen,

ich habe ein Problem mit dem readyRead Signal der RS232 Schnittstelle, man findet zwar polling Lösungen im Netz die bei mir auch funktionieren aber ich möchte es gern
Event gesteuert. Timer klar ist eine Option, aber vielleicht hat ja noch wer eine andere Lösung.

folgende Header:

Code: Alles auswählen

class Communication : public QObject
{
    Q_OBJECT
public:
    explicit Communication(QObject *parent = 0);

signals:

private:
    //****************member*****************
    QSerialPort*        _serialPort;
    QStringList*         _serialData;

    //***************function****************
    void initializeSerialPort(void);


private slots:
    void readData(void);
};


die .cpp

Code: Alles auswählen

Communication::Communication(QObject *parent) :
    QObject(parent)
{
    _serialPort = new QSerialPort(this);
    _serialData = new QStringList();

    initializeSerialPort();
}
void Communication::initializeSerialPort(void)
{
    //_serialPort->setPortName("COM27");

        foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
               qDebug() << "Name        : " << info.portName();
               qDebug() << "Description : " << info.description();
               qDebug() << "Manufacturer: " << info.manufacturer();

               _serialPort->setPort(info);}

    if(_serialPort->open(QIODevice::ReadWrite))
    {
            //Now the serial port is open try to set configuration
            _serialPort->setBaudRate(QSerialPort::Baud9600);
            _serialPort->setDataBits(QSerialPort::Data8);
            _serialPort->setParity(QSerialPort::NoParity);
            _serialPort->setStopBits(QSerialPort::OneStop);
            _serialPort->setFlowControl(QSerialPort::NoFlowControl);
            qDebug()<<"Port OPEN";
    }
    
    connect(_serialPort, SIGNAL(readyRead()), this, SLOT(readData()), Qt::QueuedConnection);
}

void Communication::readData(void)
{
    if(_serialPort->isReadable())
    {
        QString msg;
        qDebug()<<_serialPort->readAll();
        msg = _serialPort->readAll();
        _serialData->append( msg.split(";"));
    }
}
Warum wird das readyRead Signal nicht ausgelöst ? Ich habe gelesen es liegt an der Klassenimplementierung , stimmt es ?

Besten Gruß
MrCrank
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: RS232 auslesen

Beitrag von Christian81 »

Wenn das Signal nicht ausgelöst wird kommen wohl keine Daten an. Qt4 oder Qt5?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Mr.Crank
Beiträge: 38
Registriert: 16. April 2013 15:21

Re: RS232 auslesen

Beitrag von Mr.Crank »

Qt5.2 aber Qt4 ist auch vorhanden. Wenn ich eine while(true) Schleife in den Konstruktor haue und lasse den readData Slot ausführen, denn kommen die Daten an welche ich mit meinem Testprogramm sende.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: RS232 auslesen

Beitrag von Christian81 »

Kommt Qt auch in die Eventloop? Ich sehe nicht was falsch sein sollte. Am besten mal ein ganz einfaches Testprogramm schreiben - in der main() nur ein Communication-Objekt anlegen und app.exec() aufrufen.
Die QStringList mit new anzulegen ist nicht wirklich nötig. Dito für QSerialPort.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Mr.Crank
Beiträge: 38
Registriert: 16. April 2013 15:21

Re: RS232 auslesen

Beitrag von Mr.Crank »

Liegt es evtl. an der main.cpp habe es aber bereits mit einem Extra Thread probiert...

Code: Alles auswählen

int main(int argc, char *argv[])
{
//    QThread*       serialThread        = new QThread;
//    Communication* serialCommunication = new Communication;
//    serialCommunication->moveToThread(serialThread);
//    serialThread->start();

    Communication serialCommunication;

    QCoreApplication a(argc, argv);

    return a.exec();
}
Mr.Crank
Beiträge: 38
Registriert: 16. April 2013 15:21

Re: RS232 auslesen

Beitrag von Mr.Crank »

Okay ich werde das mal in einem simplem Projekt anlegen
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: RS232 auslesen

Beitrag von Christian81 »

Das sieht eigentlich ok aus ... QueuedConnection ist auch überflüssig.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Mr.Crank
Beiträge: 38
Registriert: 16. April 2013 15:21

Re: RS232 auslesen

Beitrag von Mr.Crank »

Ja.... ist durchs probieren alles rein gekommen :) Aber ich vermute fast das es am Rechner liegt. Nutze zwei USB2RS232 Converter, den einen nutze ich für Qt und den anderen nutze ich für LabView. Beide sind über ein Nullmodem verbunden und sollen miteinander kommunizieren. Mit Hercules kann ich die Daten von LabView auch sauber lesen, nur Qt will mich wieder ärgern...
Mr.Crank
Beiträge: 38
Registriert: 16. April 2013 15:21

Re: RS232 auslesen

Beitrag von Mr.Crank »

Also diese einfache main funktioniert
int main(int argc, char *argv[])
{

QCoreApplication a(argc, argv);

QSerialPort _serialPort;
_serialPort.setPortName("COM27");

if(_serialPort.open(QIODevice::ReadWrite))
{
//Now the serial port is open try to set configuration
_serialPort.setBaudRate(QSerialPort::Baud9600);
_serialPort.setDataBits(QSerialPort::Data8);
_serialPort.setParity(QSerialPort::NoParity);
_serialPort.setStopBits(QSerialPort::OneStop);
_serialPort.setFlowControl(QSerialPort::NoFlowControl);
qDebug()<<"Port OPEN";
}

while(true)
{
QString msg;
//QStringList serialData;
_serialPort.waitForReadyRead(100);
msg = _serialPort.readAll();

qDebug()<<msg;

//serialData.append(msg.split(";"));
}
return a.exec();
}
Die Daten kommen nun natürlich durch die while() irgendwie rein, was sehr unschön ist. Ic wollte aber wenn readyRead funktioniert eh die Daten cachen und dann sauber ablegen.
Zuletzt geändert von Mr.Crank am 8. Januar 2015 22:15, insgesamt 1-mal geändert.
Mr.Crank
Beiträge: 38
Registriert: 16. April 2013 15:21

Re: RS232 auslesen

Beitrag von Mr.Crank »

wenn ich jetzt eine Abfrage rumbastel, sodass es nur liest wenn Bytes verfügbar sind. Liest er nichts mehr ein.....

Code: Alles auswählen

    while(true)
    {
        if(_serialPort.bytesAvailable()>0)
        {
            QString msg;
            _serialPort.waitForReadyRead(100);
            msg = _serialPort.readAll();

            qDebug()<<msg;
        }
    }
Ist doch irgendwie ein Widerspruch, laut Doku liefert bytesAvailable den Wert der Bytes die zum Abfragezeitpunkt am Port zum Auslesen bereit stehen.
Mr.Crank
Beiträge: 38
Registriert: 16. April 2013 15:21

Re: RS232 auslesen

Beitrag von Mr.Crank »

Fehler lag in der main -.- hab alles über der Application gesetzt.....
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: RS232 auslesen

Beitrag von Christian81 »

Stimmt, ist mir aber auch nicht aufgefallen. Ja solange noch kein Q(Core)Application Objekt erzeugt ist geht vieles nicht - vor allem wenn es um Events und Co geht.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten