Unsolved QSerialPort data missing while reading
-
serial->setBaudRate(QSerialPort::Baud57600); serial->setStopBits(QSerialPort::TwoStop); serial->setPortName("COM8"); serial->setDataBits(QSerialPort::TwoStop); serial->setFlowControl(QSerialPort::NoFlowControl); serial->setParity(QSerialPort::NoParity); serial->setReadBufferSize(4);
device side is:
ROM_UARTConfigSetExpClk(UART6_BASE,systemClock , 57600, (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_TWO| UART_CONFIG_PAR_NONE));
In your config ,are you sure about ,
serial->setDataBits(QSerialPort::TwoStop);
?setDataBits contains an enum and can be
QSerialPort::Data5
5
The number of data bits in each character is 5. It is used for Baudot code. It generally only makes sense with older equipment such as teleprinters.
QSerialPort::Data6
6
The number of data bits in each character is 6. It is rarely used.
QSerialPort::Data7
7
The number of data bits in each character is 7. It is used for true ASCII. It generally only makes sense with older equipment such as teleprinters.
QSerialPort::Data8
8
The number of data bits in each character is 8. It is used for most kinds of data, as this size matches the size of a byte. It is almost universally used in newer applications.have a look at this enum from qt doc
http://doc.qt.io/qt-5/qserialport.html#DataBits-enum
So for me this should be :
serial->setDataBits(QSerialPort::Data8);
-
sorry it was an error while editing the source code. it was like you mention
-
@biomed12 said in QSerialPort data missing while reading:
sorry it was an error while editing the source code. it was like you mention
Just for information are you receiving a part of your data ?
Or you do not receive your data at all and receive another insignificant data?
-
Hi
Adding to @mostefa , your logic is not optimal ( in serialReadData)
serialInData = serial->readAll(); // this might not read all and next signal will override data already received.
//
if(serialInData.length()!= 4 || serialInData[0] != 'a' || serialInData[3] != 'b')a more common design is
void MedicalSoftware::serialReadData()
{
//// -> this goes as memeber of class (.h file) QByteArray serialInData;
//
serialInData += serial->readAll(); // we ADDif ( serialInData.size() >= COUNT_EXPECTED ) { // process
// check format etc
if(serialInData.length()!= 4 || serialInData[0] != 'a' || serialInData[3] != '
serialInData.clear();// clear buffer for next full read. Note if you have excess data u need to handle it here. -
Adding to what @mrjj said
When readall is called you may received just part of your frame,
For example , we are going to send
"HELLO WORLD"
on the serial portthis can be sent in two times :
at time t0
"HEL"
is received
at time t1"O WORLD"
is receivedIf you are doing your readall, at time t0 you can receive just part of data
To avoid this you can use
readyRead
signal, and QByteArray bufferconnect(nameOfyourSerialPort,SIGNAL(readyRead(),this,SLOT(onPartOfFrameAvailable());
QByteArray mWholeData;//var member this is our buffer void onPartOfFrameAvailable() { mWholeData.append(nameOfyourSerialPort->readAll()); qDebug() << "for the moment wholeData contains" << mWholeData; }
If you send
"HELLO WORLD"
the result will be for example:First output : for the moment wholedata contains
"HEL";
Second output : for the moment wholedata contains"HELLO WORL"
Thirs output : for the moment wholedata contains"HELLO WORLD"
; -
@mostefa
Yes, I have this trouble definitely. I will try and share the results. -
@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..