Important: Please read the Qt Code of Conduct -

canReadLine QIODevice

  • Hello,

    I'm trying to implement a serial connection with QIODevice (SerialPort). I would like to parse line by line (each line consists of multiple columns of data) and for this I found canReadLine().
    But as I understand I have to use startTransaction, because otherwise the buffer will not be used. I'm I correct?

    bool QIODevice::canReadLine() const
        Q_D(const QIODevice);
        return d->buffer.indexOf('\n', d->buffer.size(),
                                 d->isSequential() ? d->transactionPos : Q_INT64_C(0)) >= 0;

    So to read a full line, I have to open a QSerialPort and then start a Transaction. Then I have to wait a little bit (till data is in the buffer) and then I can use canReadLine. Am I correct? Is there a better way instead to wait a little bit? Or is it the wrong way to go?

  • Lifetime Qt Champion


    Why not use QSerialPort, cumulate arrived data in a QByteArrsy and then apply the line check to the cumulated data ?

  • I'm using QSerialPort. But then I have to implement a ringbuffer my self to parse always complete lines

  • Qt Champions 2020

    What are problem in this approach?

        while (m_serial->canReadLine()) {
            const QByteArray line = m_serial->readLine();

  • And otherwise I return without doing something and wait for the next onReadyRead signal?
    I will try it out

Log in to reply