[Interest] Parsing data from serialport

Martin Marmsoler martin.marmsoler at gmail.com
Wed Apr 3 09:49:00 CEST 2019


But why I need a new buffer when there already one exist? (the QIODevice
and my own buffer or?)

My idea:

Main() {
Connect(readyread, myreadyread)
}

myreadyread() {

If (!canreadline())
   Return;

Parsedata() ;

}

With this idea I have again the problem with the while loop, but I dont
need two buffers.
Is it an alternative?

Martin

Jérôme Godbout <godboutj at amotus.ca> schrieb am Mi., 3. Apr. 2019, 00:01:

> 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> 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
>   Software Architect - Intel System Software Products
>
>
>
> _______________________________________________
> Interest mailing list
> Interest at qt-project.org
> https://lists.qt-project.org/listinfo/interest
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20190403/30009ec8/attachment.html>


More information about the Interest mailing list