[Interest] Parsing data from serialport

Martin Marmsoler martin.marmsoler at gmail.com
Thu Apr 4 08:24:05 CEST 2019


Thank you Jérome for the explanation. I implement it like you said.

Martin

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

> Because you cannot unread data from the device and you have no guarantee
> that all the data will be present when you do read, you need a buffer since
> you need a whole line to process the data and data might be present but the
> line might not be fully arrived yet, maybe just half of it. The IODevice
> (Serial) buffer is buffering the reception of the data until you read it,
> your buffer is checking data is competed to be parsed, they have a
> different purpose.
>
>
>
>
> [image: 36E56279]
>
> une compagnie
>
> RAPPROCHEZ LA DISTANCE
>
> *Jérôme Godbout*
> Développeur Logiciel Sénior /
> Senior Software Developer
>
> *p:* +1 (418) 800-1073 ext.:109
>
> amotus.ca <http://www.amotus-solutions.com/>
> statum-iot.com
>
> <https://www.facebook.com/LesSolutionsAmotus/>
> <https://www.linkedin.com/company/amotus-solutions/>
> <https://twitter.com/AmotusSolutions>
> <https://www.youtube.com/channel/UCoYpQgsmj1iJZyDjTQ3x8Ig>
>
>
>
>
>
> *From:* Martin Marmsoler <martin.marmsoler at gmail.com>
> *Sent:* April 3, 2019 3:49 AM
> *To:* Jérôme Godbout <godboutj at amotus.ca>
> *Cc:* Thiago Macieira <thiago.macieira at intel.com>; interest at qt-project.org
> *Subject:* Re: [Interest] Parsing data from serialport
>
>
>
> 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/20190404/5c41e2ee/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: image004.png
Type: image/png
Size: 506 bytes
Desc: not available
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20190404/5c41e2ee/attachment.png>


More information about the Interest mailing list