Thank you Jérome for the explanation. I implement it like you said. Martin
Jérôme Godbout <godbo...@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.marmso...@gmail.com> > *Sent:* April 3, 2019 3:49 AM > *To:* Jérôme Godbout <godbo...@amotus.ca> > *Cc:* Thiago Macieira <thiago.macie...@intel.com>; interest@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 <godbo...@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-boun...@qt-project.org> *On Behalf Of *Martin > Marmsoler > *Sent:* April 2, 2019 3:58 PM > *To:* Thiago Macieira <thiago.macie...@intel.com> > *Cc:* interest@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.macie...@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@qt-project.org > https://lists.qt-project.org/listinfo/interest > >
_______________________________________________ Interest mailing list Interest@qt-project.org https://lists.qt-project.org/listinfo/interest