Unsolved QSerialPort data missing while reading
-
@biomed12 said in QSerialPort data missing while reading:
Yes, I have this trouble definitely. I will try and share the results.
Ok keep us informed ;)
-
@mostefa said in QSerialPort data missing while reading:
@biomed12 said in QSerialPort data missing while reading:
Yes, I have this trouble definitely. I will try and share the results.
Ok keep us informed ;)
ooppss.. Qbyte array is getting larger always.
-
@biomed12 said in QSerialPort data missing while reading:
@mostefa said in QSerialPort data missing while reading:
@biomed12 said in QSerialPort data missing while reading:
Yes, I have this trouble definitely. I will try and share the results.
Ok keep us informed ;)
ooppss.. Qbyte array is getting larger always.
Getting larger than what?
I don't understand could you provide more details please?
-
@mostefa said in QSerialPort data missing while reading:
@biomed12 said in QSerialPort data missing while reading:
@mostefa said in QSerialPort data missing while reading:
@biomed12 said in QSerialPort data missing while reading:
Yes, I have this trouble definitely. I will try and share the results.
Ok keep us informed ;)
ooppss.. Qbyte array is getting larger always.
Getting larger than what?
I don't understand could you provide more details please?
like
axx
axxxaxa
axaxaxxxxI am trying now this algorithm, what is your opinion?
QByteArray serialData; union { unsigned char bytes[2]; unsigned int intPart; }serData; //! [7] void MainWindow::readData() { serialData.append(serial->readAll()); if(serialData.length()<4 || serialData[0] != 'a' || serialData[3] != 'b') { return; } serData.bytes[0] = serialData[1]; serData.bytes[1] = serialData[2]; qDebug()<<QString::number(serData.intPart); serData.intPart = 0; //qDebug()<<QString::number(data.length()); console->append(QString::fromLatin1(serialData)); serialData.clear(); }
-
@biomed12 said in QSerialPort data missing while reading:
@mostefa said in QSerialPort data missing while reading:
@biomed12 said in QSerialPort data missing while reading:
@mostefa said in QSerialPort data missing while reading:
@biomed12 said in QSerialPort data missing while reading:
Yes, I have this trouble definitely. I will try and share the results.
Ok keep us informed ;)
ooppss.. Qbyte array is getting larger always.
Getting larger than what?
I don't understand could you provide more details please?
like
axx
axxxaxa
axaxaxxxxI am trying now this algorithm, what is your opinion?
QByteArray serialData; union { unsigned char bytes[2]; unsigned int intPart; }serData; //! [7] void MainWindow::readData() { serialData.append(serial->readAll()); if(serialData.length()<4 || serialData[0] != 'a' || serialData[3] != 'b') { return; } serData.bytes[0] = serialData[1]; serData.bytes[1] = serialData[2]; qDebug()<<QString::number(serData.intPart); serData.intPart = 0; //qDebug()<<QString::number(data.length()); console->append(QString::fromLatin1(serialData)); serialData.clear(); }
I am not able to understand all what you are doing
Why don't we start with simple things:
So
-
When you
readData
is CALLED ? , is it a SLOT ? , is it connected to readyRead signal? -
What is the output of this code?
For example we keep only this part of the code :
// i am trying only to keepthe basic lines for reading serial port QByteArray serialData; union { unsigned char bytes[2]; unsigned int intPart; }serData; //! [7] void MainWindow::readData() { serialData.append(serial->readAll()); qDebug() << "receivedthat for the moment = " << serialData; }
-
-
@mostefa said in QSerialPort data missing while reading:
@biomed12 said in QSerialPort data missing while reading:
@mostefa said in QSerialPort data missing while reading:
@biomed12 said in QSerialPort data missing while reading:
@mostefa said in QSerialPort data missing while reading:
@biomed12 said in QSerialPort data missing while reading:
Yes, I have this trouble definitely. I will try and share the results.
Ok keep us informed ;)
ooppss.. Qbyte array is getting larger always.
Getting larger than what?
I don't understand could you provide more details please?
like
axx
axxxaxa
axaxaxxxxI am trying now this algorithm, what is your opinion?
QByteArray serialData; union { unsigned char bytes[2]; unsigned int intPart; }serData; //! [7] void MainWindow::readData() { serialData.append(serial->readAll()); if(serialData.length()<4 || serialData[0] != 'a' || serialData[3] != 'b') { return; } serData.bytes[0] = serialData[1]; serData.bytes[1] = serialData[2]; qDebug()<<QString::number(serData.intPart); serData.intPart = 0; //qDebug()<<QString::number(data.length()); console->append(QString::fromLatin1(serialData)); serialData.clear(); }
I am not able to understand all what you are doing
Why don't we start with simple things:
So
-
When you
readData
is CALLED ? , is it a SLOT ? , is it connected to readyRead signal? -
What is the output of this code?
For example we keep only this part of the code :
// i am trying only to keepthe basic lines for reading serial port QByteArray serialData; union { unsigned char bytes[2]; unsigned int intPart; }serData; //! [7] void MainWindow::readData() { serialData.append(serial->readAll()); qDebug() << "receivedthat for the moment = " << serialData; }
Guy,
- Of course the signal slot mechanism such you mention.
- The code is always append received data to buffer. But, I need just four bytes. My microcontroller send datas like that:
starts with 'a' char and, 2 data bytes which include what i want, and terminates with 'b'
for example; "affb", i need the ff data.
So, your codes output like that:
affb
affbaffb
affbaffbaffbbecause you are appending new datas consistently the buffer.
-
-
Foo::onReadyRead() { for (;;) { if (serial->bytesAvailable() < 4) return; const QByteArray peeked = serial-> peek(4); QDataStream ds(peeked); qint8 a; qint8 b; qint16 data; ds >> a >> data >> b; if (a == 'a' && b == 'b') { // all good, data variable contains ADC value serial->read(4); // dummy read whole frame } else { serial->read(1); // try to synchronise } } //end for }
-
@biomed12 said in QSerialPort data missing while reading:
@mostefa said in QSerialPort data missing while reading:
@biomed12 said in QSerialPort data missing while reading:
@mostefa said in QSerialPort data missing while reading:
@biomed12 said in QSerialPort data missing while reading:
@mostefa said in QSerialPort data missing while reading:
@biomed12 said in QSerialPort data missing while reading:
Yes, I have this trouble definitely. I will try and share the results.
Ok keep us informed ;)
ooppss.. Qbyte array is getting larger always.
Getting larger than what?
I don't understand could you provide more details please?
like
axx
axxxaxa
axaxaxxxxI am trying now this algorithm, what is your opinion?
QByteArray serialData; union { unsigned char bytes[2]; unsigned int intPart; }serData; //! [7] void MainWindow::readData() { serialData.append(serial->readAll()); if(serialData.length()<4 || serialData[0] != 'a' || serialData[3] != 'b') { return; } serData.bytes[0] = serialData[1]; serData.bytes[1] = serialData[2]; qDebug()<<QString::number(serData.intPart); serData.intPart = 0; //qDebug()<<QString::number(data.length()); console->append(QString::fromLatin1(serialData)); serialData.clear(); }
I am not able to understand all what you are doing
Why don't we start with simple things:
So
-
When you
readData
is CALLED ? , is it a SLOT ? , is it connected to readyRead signal? -
What is the output of this code?
For example we keep only this part of the code :
// i am trying only to keepthe basic lines for reading serial port QByteArray serialData; union { unsigned char bytes[2]; unsigned int intPart; }serData; //! [7] void MainWindow::readData() { serialData.append(serial->readAll()); qDebug() << "receivedthat for the moment = " << serialData; }
Guy,
- Of course the signal slot mechanism such you mention.
- The code is always append received data to buffer. But, I need just four bytes. My microcontroller send datas like that:
starts with 'a' char and, 2 data bytes which include what i want, and terminates with 'b'
for example; "affb", i need the ff data.
So, your codes output like that:
affb
affbaffb
affbaffbaffbbecause you are appending new datas consistently the buffer.
Ok , it's clear for now
QByteArray dataToTreat; void MainWindow::readData() { serialData.append(serial->readAll()); if(serialData.startWith('a') { if(serialData.length() > 4) { dataToTreat = serialData.left(4); serialData.remove(0,4); } } else { // Not a normal case } // DO WHAT YOU WANT serData.bytes[0] = serialData[1]; serData.bytes[1] = serialData[2]; qDebug()<<QString::number(serData.intPart); serData.intPart = 0; //qDebug()<<QString::number(data.length()); console->append(QString::fromLatin1(serialData)); serialData.clear(); }
-
-
I want to get the second and third byte of data to in another union type TO MAKE it unsigned int like 4095.
-
even with the last code i proposed?
Or you can try to use the code of @kuzulis , this can be the best way to achieve what you want -
@mostefa said in QSerialPort data missing while reading:
even with the last code i proposed?
Or you can try to use the code of @kuzulis , this can be the best way to achieve what you wantbaü
baü
baÿ
baÿ
baÿ
baÿ
baþ
baþ
baÿ
baÿ
baÿ
baÿ
baÿ
baÿ
baÿ
baÿ
baÿ
baÿ
baÿ
baÿ
baÿ
baÿ
baÿ
baÿ
baÿAgain. always framing error.
-
@kuzulis said in QSerialPort data missing while reading:
//your code here ```Foo:onReadyRead() { for (;;) { if (serial->bytesAvailable() < 4) return; QByteArray peeked = serial-> peek(4); QDataStream ds(peeked); qint8 a; qint8 b; qint16 data; ds >> a >> data >> b; if (a == 'a' && b == 'b') { // all good, data variable contains ADC value serial-> read(4); // dummy read whole frame } else { serial-> read(1); // try } } //end for }
how to leave from for(;;)?
-
@biomed12 said in QSerialPort data missing while reading:
@mostefa said in QSerialPort data missing while reading:
even with the last code i proposed?
Or you can try to use the code of @kuzulis , this can be the best way to achieve what you wantbaü
baü
baÿ
baÿ
baÿ
baÿ
baþ
baþ
baÿ
baÿ
baÿ
baÿ
baÿ
baÿ
baÿ
baÿ
baÿ
baÿ
baÿ
baÿ
baÿ
baÿ
baÿ
baÿ
baÿAgain. always framing error.
baÿ
Looks like ba is correctly in hex , but ÿ is in ascii
The hex code equivalent to ÿ is ff
http://www.rapidtables.com/convert/number/ascii-to-hex.htm
this will lead actually to baffbaffbaff... and i think that this is what you need?
So there is a conversion problem in your code( or maybe just a display problem)
-
@biomed12 said in QSerialPort data missing while reading:
how to leave from for(;;)?
if (serial->bytesAvailable() < 4) return;
@biomed12 said in QSerialPort data missing while reading:
Again. always framing error.
Are you sure, your setting:
serial->setStopBits(QSerialPort::TwoStop);
were applied?
@biomed12 said in QSerialPort data missing while reading:
baÿ
baÿ
baÿTry to output the data variable instead...
PS1: QSerialPort is a buffered class and nothing missed.
PS2:
serial->setReadBufferSize(4);
need to remove it if you do not know what for..
-
I solved framing errror problem with this algorithm:
Device send datas like:
sendData[0] = (char)'a'; sendData[1] = (char)'k'; sendData[2] = adcValue.bytes[0]; sendData[3] = (adcValue.bytes[1] & 15);
Read data algorithm:
union{ unsigned char bytes[2]; unsigned int intPart; unsigned char *ptr; }serData; void MedicalSoftware::serialReadData() { if(serial->bytesAvailable()<4) { return; } QByteArray serialInData = serial->readAll(); //my algorithm if(serialInData[0] == 'a' && serialInData[1] == 'k') { serData.bytes[0] = serialInData[2]; serData.bytes[1] = serialInData[3]; }else if(serialInData[2] == 'a' && serialInData[3] == 'k') { serData.bytes[0] = serialInData[0]; serData.bytes[1] = serialInData[1]; } else if(serialInData[1] == 'a' && serialInData[2] == 'k') { serial->read(1); return; }else if(serialInData[0] == 'k' && serialInData[3] == 'a') { serData.bytes[0] = serialInData[1]; serData.bytes[1] = serialInData[2]; } if(plotDataButtonStatus == true) { plotMainGraph(serData.intPart); } serData.intPart = 0; }
I have another problem now:) but it is another topic. Thanks
my new problem if you wonder:
http://stackoverflow.com/questions/42742033/qcustomplot-huge-amount-of-data-plotting