[Interest] Parsing data from serialport

Paolo Angelelli paolo.angelelli at qt.io
Thu Apr 4 16:19:28 CEST 2019


What is the advantage of having such a continuous reading loop in a separate thread?

I mean it as opposed to reacting to the readyRead() signal, and having a while(canReadLine()) { ... } in the reacting
slot.


On Tue, 2 Apr 2019 22:01:49 +0000
Jérôme Godbout <godboutj at amotus.ca> wrote:

> Make sure your reading loop and processing data are separated. Call you read device when needed or into a loop that can take some pause to avoid 100% CPU usage for nothing.
> 
> QByteArray buffer;
> 
> void ReadDeviceHaveData()
> {
> 
>    while(serial_port->bytesAvailable()) // This can be dangerous is data keep coming  and might be removed
> {
>             // You can read bytes per bytes or smaller chunk over here for better reactivity and less memory consumption
>             buffer.append(serial_port->readAll());
>             processData();
>             serial_port->waitForReadyRead(5);
>      }
> }
> 
> void ProcessData()
> {
>    int pos = buffer.indexOf(‘\n’);
> 
>    while(pos >= 0)
>    {
>      QByteArray line = buffer.left(pos);
>      // Strip trailing \r for windows here
>      // Do whatever you need with your line, check data integrity
> 
>      // Remove the processed data but leave the unprocessed data alone
>      buffer.remove(0, pos + 1); // Remove \n too
>      pos = buffer.indexOf(‘\n’);
>    }
> }
> 
> From: Interest <interest-bounces at qt-project.org> On Behalf Of Martin Marmsoler
> Sent: April 2, 2019 3:58 PM
> To: Thiago Macieira <thiago.macieira at intel.com>
> Cc: interest at qt-project.org
> Subject: Re: [Interest] Parsing data from serialport
> 
>  > To be able to roll back, in case your reading from the device didn't result in  
> what you wanted or you got an error. See QDataStream.
> Ah ok I understand.
> 
> So this minimal example
> QSerialPort sPort;
> sPort.open(QIODevice::ReadOnly);
> 
> if(sPort.waitForReadyRead(2000)){
> 
>   while (!device.atEnd()) {
> 
>         if (device.canReadLine()) {
> 
>                newData.push_back(device.readLine());
> 
>                linesToRead++;
> 
>         } else {
> 
>                return;
> 
>         }
> 
>                }
> 
>    ...
> 
> }
> 
> works fine, if I go trough it step by step (maybe, because enouth data come in). But if I'm to fast it does not work.
> 
> If I'm using the signal readyRead I will have the same problem, because new data come everytime. So I check that in the
> 
> readyRead function if a complete line come in, and if no complete line I return without doing something otherwise I do
> 
> something with the data? Is this the right way?
> 
> 
> 
> Martin
> 
> 
> 
> 
> Thiago Macieira <thiago.macieira at intel.com<mailto:thiago.macieira at intel.com>> schrieb am Di., 2. Apr. 2019, 18:02:
> On Tuesday, 2 April 2019 07:04:03 PDT Martin Marmsoler wrote:
> > Thank you Thiago for your response. But what is transactionstart for?  
> 
> To be able to roll back, in case your reading from the device didn't result in
> what you wanted or you got an error. See QDataStream.
> 
> --
> Thiago Macieira - thiago.macieira (AT) intel.com<http://intel.com>
>   Software Architect - Intel System Software Products
> 
> 
> 
> _______________________________________________
> Interest mailing list
> Interest at qt-project.org<mailto:Interest at qt-project.org>
> https://lists.qt-project.org/listinfo/interest



More information about the Interest mailing list