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