[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