[Interest] Parsing data from serialport

Jason H jhihn at gmx.com
Thu Apr 4 17:01:06 CEST 2019


Maybe you don't need another thread, just maybe an event loop (QEventLoop)?


> Sent: Thursday, April 04, 2019 at 10:43 AM
> From: "Jérôme Godbout" <godboutj at amotus.ca>
> To: "Paolo Angelelli" <paolo.angelelli at qt.io>, "interest at qt-project.org" <interest at qt-project.org>
> Subject: Re: [Interest] Parsing data from serialport
>
> It relief the main thread from read data all the time and keep a good reactivity. The dedicated thread try to read and can wait until something come along and once it found something that can be parsed, it emit his own signal that the main thread only have to handle into normal slot (will be queued, since it's not the same thread).
> 
> But yeah, you can have the main thread do it and process the readyRead(), you main thread will perform the read and parsing. if you have any CRC and other things, this might be bad for application reactivity, depending on the amount of data flowing.
> 
> -----Original Message-----
> From: Interest <interest-bounces at qt-project.org> On Behalf Of Paolo Angelelli
> Sent: April 4, 2019 10:19 AM
> To: interest at qt-project.org
> Subject: Re: [Interest] Parsing data from serialport
> 
> 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
> 
> _______________________________________________
> Interest mailing list
> Interest at qt-project.org
> https://lists.qt-project.org/listinfo/interest
> _______________________________________________
> Interest mailing list
> Interest at qt-project.org
> https://lists.qt-project.org/listinfo/interest
>


More information about the Interest mailing list