Seite 1 von 1

RS232 auslesen

Verfasst: 8. Januar 2015 00:21
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

Re: RS232 auslesen

Verfasst: 8. Januar 2015 17:30
von Christian81
Wenn das Signal nicht ausgelöst wird kommen wohl keine Daten an. Qt4 oder Qt5?

Re: RS232 auslesen

Verfasst: 8. Januar 2015 18:25
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.

Re: RS232 auslesen

Verfasst: 8. Januar 2015 19:46
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.

Re: RS232 auslesen

Verfasst: 8. Januar 2015 19:48
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();
}

Re: RS232 auslesen

Verfasst: 8. Januar 2015 19:51
von Mr.Crank
Okay ich werde das mal in einem simplem Projekt anlegen

Re: RS232 auslesen

Verfasst: 8. Januar 2015 20:01
von Christian81
Das sieht eigentlich ok aus ... QueuedConnection ist auch überflüssig.

Re: RS232 auslesen

Verfasst: 8. Januar 2015 20:14
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...

Re: RS232 auslesen

Verfasst: 8. Januar 2015 20:27
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.

Re: RS232 auslesen

Verfasst: 8. Januar 2015 20:45
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.

Re: RS232 auslesen

Verfasst: 8. Januar 2015 21:08
von Mr.Crank
Fehler lag in der main -.- hab alles über der Application gesetzt.....

Re: RS232 auslesen

Verfasst: 9. Januar 2015 18:17
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.