Discussion:
[Interest] QSerialPort read issue
nus1998
2013-10-15 14:37:13 UTC
Permalink
I found a strange issue, when I read from serial, first I will call "waitForReadyRead", it returns with true in specified time, however, when I call "read" function thereafter, I can't read even a byte. the hardware works fine since I checked it by logic analyzer.


env: win7 64, qt 5.1 mingw version

thanks
Je

----
from iPad
Denis Shienkov
2013-10-15 17:15:36 UTC
Permalink
Hi.

Seems it is a bug, see: https://bugreports.qt-project.org/browse/QTBUG-33987

You can test this patch.

Besd regards,
Denis
Post by nus1998
I found a strange issue, when I read from serial, first I will call
"waitForReadyRead", it returns with true in specified time, however,
when I call "read" function thereafter, I can't read even a byte. the
hardware works fine since I checked it by logic analyzer.
env: win7 64, qt 5.1 mingw version
thanks
Je
----
from iPad
_______________________________________________
Interest mailing list
http://lists.qt-project.org/mailman/listinfo/interest
nus1998
2013-10-16 00:55:12 UTC
Permalink
HI Denis,

Thanks for the reply.

Even if I don't use "waitForReadyRead" but polling "bytesAvailable" instead, the later always returns 0 although there is data received and I can use other terminal software to display it too.

Best regards,
Je





At 2013-10-16 01:15:36,"Denis Shienkov" <***@yandex.ru> wrote:

Hi.

Seems it is a bug, see: https://bugreports.qt-project.org/browse/QTBUG-33987

You can test this patch.

Besd regards,
Denis


15.10.2013 18:37, nus1998 пОшет:


I found a strange issue, when I read from serial, first I will call "waitForReadyRead", it returns with true in specified time, however, when I call "read" function thereafter, I can't read even a byte. the hardware works fine since I checked it by logic analyzer.


env: win7 64, qt 5.1 mingw version

thanks
Je

----
from iPad
Mandeep Sandhu
2013-10-16 03:41:18 UTC
Permalink
You can also try doing a raw read (non Qt way) on the device using
open/read system calls and check if data is actually available.
That'll make sure that the OS is indeed receiving data and the problem
can then be isolated to QSerialPort.

HTH,
-mandeep
Post by nus1998
HI Denis,
Thanks for the reply.
Even if I don't use "waitForReadyRead" but polling "bytesAvailable" instead,
the later always returns 0 although there is data received and I can use
other terminal software to display it too.
Best regards,
Je
Hi.
Seems it is a bug, see: https://bugreports.qt-project.org/browse/QTBUG-33987
You can test this patch.
Besd regards,
Denis
I found a strange issue, when I read from serial, first I will call
"waitForReadyRead", it returns with true in specified time, however, when I
call "read" function thereafter, I can't read even a byte. the hardware
works fine since I checked it by logic analyzer.
env: win7 64, qt 5.1 mingw version
thanks
Je
----
from iPad
_______________________________________________
Interest mailing list
http://lists.qt-project.org/mailman/listinfo/interest
_______________________________________________
Interest mailing list
http://lists.qt-project.org/mailman/listinfo/interest
nus1998
2013-10-16 03:51:00 UTC
Permalink
I write a workaround function as below which now works although the actual timeout doesn't match with "TIMEOUT" since sometimes "waitForReadyRead" will return immediately without data available. I have patched "https://codereview.qt-project.org/#patch,sidebyside,67962,2,src/serialport/qserialport_win.cpp" yet.


boolWidget::waitBytes(qint64n)
{
for(inti=0;i<TIMEOUT;i++)
{
if(m_serial->bytesAvailable()>=n)
returntrue;


m_serial->waitForReadyRead(1);
}


returnfalse;
}
Post by Mandeep Sandhu
You can also try doing a raw read (non Qt way) on the device using
open/read system calls and check if data is actually available.
That'll make sure that the OS is indeed receiving data and the problem
can then be isolated to QSerialPort.
HTH,
-mandeep
Post by nus1998
HI Denis,
Thanks for the reply.
Even if I don't use "waitForReadyRead" but polling "bytesAvailable" instead,
the later always returns 0 although there is data received and I can use
other terminal software to display it too.
Best regards,
Je
Hi.
Seems it is a bug, see: https://bugreports.qt-project.org/browse/QTBUG-33987
You can test this patch.
Besd regards,
Denis
I found a strange issue, when I read from serial, first I will call
"waitForReadyRead", it returns with true in specified time, however, when I
call "read" function thereafter, I can't read even a byte. the hardware
works fine since I checked it by logic analyzer.
env: win7 64, qt 5.1 mingw version
thanks
Je
----
from iPad
_______________________________________________
Interest mailing list
http://lists.qt-project.org/mailman/listinfo/interest
_______________________________________________
Interest mailing list
http://lists.qt-project.org/mailman/listinfo/interest
Denis Shienkov
2013-10-16 07:50:57 UTC
Permalink
nus1998
2013-10-16 08:02:14 UTC
Permalink
Hi,

I just test it, so I think blocking method is not the issue. and even when I use "connect(m_serial, SIGNAL(readyRead()), this, SLOT(serialRead())); "
mostly the serialRead slot can read nothing too..

I tested the following two sample on a loopthrough uart, which make me confused since there is no timeout error for both test.

Can't read data:

waitForReadyRead(1000);

read(data, 1);


Can read data:
waitForReadyRead(100);
waitForReadyRead(100);
waitForReadyRead(100);
waitForReadyRead(100);

read(data, 1);


.
Best regards,
Je








At 2013-10-16 15:50:57,"Denis Shienkov" <***@yandex.ru> wrote:

Hi.

You wrong do it, because it isn't recommended to use the waitForXXX() methods from an main GUI thread.

You should use the non-blocking approach because it is preferred way, e.g. see the Terminal example or Master and Slave Examples from the QtSerialPort sources.

Best regards,
Denis


16.10.2013, 07:51, "nus1998" <***@yeah.net>:
I write a workaround function as below which now works although the actual timeout doesn't match with "TIMEOUT" since sometimes "waitForReadyRead" will return immediately without data available. I have patched "https://codereview.qt-project.org/#patch,sidebyside,67962,2,src/serialport/qserialport_win.cpp" yet.


boolWidget::waitBytes(qint64n)
{
for(inti=0;i<TIMEOUT;i++)
{
if(m_serial->bytesAvailable()>=n)
returntrue;

m_serial->waitForReadyRead(1);
}

returnfalse;
}
Post by Mandeep Sandhu
You can also try doing a raw read (non Qt way) on the device using
open/read system calls and check if data is actually available.
That'll make sure that the OS is indeed receiving data and the problem
can then be isolated to QSerialPort.
HTH,
-mandeep
Post by nus1998
HI Denis,
Thanks for the reply.
Even if I don't use "waitForReadyRead" but polling "bytesAvailable" instead,
the later always returns 0 although there is data received and I can use
other terminal software to display it too.
Best regards,
Je
Hi.
Seems it is a bug, see: https://bugreports.qt-project.org/browse/QTBUG-33987
You can test this patch.
Besd regards,
Denis
I found a strange issue, when I read from serial, first I will call
"waitForReadyRead", it returns with true in specified time, however, when I
call "read" function thereafter, I can't read even a byte. the hardware
works fine since I checked it by logic analyzer.
env: win7 64, qt 5.1 mingw version
thanks
Je
----
from iPad
_______________________________________________
Interest mailing list
http://lists.qt-project.org/mailman/listinfo/interest
_______________________________________________
Interest mailing list
http://lists.qt-project.org/mailman/listinfo/interest
Denis Shienkov
2013-10-16 08:08:04 UTC
Permalink
nus1998
2013-10-16 08:24:34 UTC
Permalink
Hi, the simple code is followed, I use wizard to generate qt gui application in widget method
for "#if 1", the message is "port open, A, A, done", for "#if 0", the message is "port open, A, B, done"

#include<QDebug>
#include<QtSerialPort/QtSerialPort>


Widget::Widget(QWidget*parent):
QWidget(parent),
ui(newUi::Widget)
{
ui->setupUi(this);


QSerialPort*port=newQSerialPort(this);
charc1,c2;


port->setPortName("COM4");
if(port->open(QIODevice::ReadWrite))
{
port->setBaudRate(QSerialPort::Baud9600);
port->setDataBits(QSerialPort::Data8);
port->setStopBits(QSerialPort::OneStop);
port->setParity(QSerialPort::NoParity);
port->setFlowControl(QSerialPort::NoFlowControl);
qDebug()<<"portopen";
}
else
qDebug()<<"portopenerror";


port->clear();
c1='A';
port->write(&c1,1);
port->waitForReadyRead(3000);
port->read(&c2,1);
qDebug()<<c2;


c1='B';
port->write(&c1,1);
#if1
port->waitForReadyRead(3000);
#else
port->waitForReadyRead(100);
port->waitForReadyRead(100);
#endif
port->read(&c2,1);
qDebug()<<c2;
qDebug()<<"done";
}







At 2013-10-16 16:08:04,"Denis Shienkov" <***@yandex.ru> wrote:

Hi.
Post by nus1998
I just test it, so I think blocking method is not the issue. and even when I use "connect(m_serial, SIGNAL(readyRead()), this, SLOT(serialRead())); "
mostly the serialRead slot can read nothing too..

Seems, you do something wrong.
Post by nus1998
waitForReadyRead(1000);
read(data, 1);
Same...

Please provide the simple test application (sources) to reproduce the problem.

Best regards,
Denis


16.10.2013, 12:03, "nus1998" <***@yeah.net>:
Hi,

I just test it, so I think blocking method is not the issue. and even when I use "connect(m_serial, SIGNAL(readyRead()), this, SLOT(serialRead())); "
mostly the serialRead slot can read nothing too..

I tested the following two sample on a loopthrough uart, which make me confused since there is no timeout error for both test.

Can't read data:

waitForReadyRead(1000);

read(data, 1);


Can read data:
waitForReadyRead(100);
waitForReadyRead(100);
waitForReadyRead(100);
waitForReadyRead(100);

read(data, 1);


.
Best regards,
Je










At 2013-10-16 15:50:57,"Denis Shienkov" <***@yandex.ru> wrote:

Hi.

You wrong do it, because it isn't recommended to use the waitForXXX() methods from an main GUI thread.

You should use the non-blocking approach because it is preferred way, e.g. see the Terminal example or Master and Slave Examples from the QtSerialPort sources.

Best regards,
Denis


16.10.2013, 07:51, "nus1998" <***@yeah.net>:
I write a workaround function as below which now works although the actual timeout doesn't match with "TIMEOUT" since sometimes "waitForReadyRead" will return immediately without data available. I have patched "https://codereview.qt-project.org/#patch,sidebyside,67962,2,src/serialport/qserialport_win.cpp" yet.


boolWidget::waitBytes(qint64n)
{
for(inti=0;i<TIMEOUT;i++)
{
if(m_serial->bytesAvailable()>=n)
returntrue;

m_serial->waitForReadyRead(1);
}

returnfalse;
}
Post by nus1998
You can also try doing a raw read (non Qt way) on the device using
open/read system calls and check if data is actually available.
That'll make sure that the OS is indeed receiving data and the problem
can then be isolated to QSerialPort.
HTH,
-mandeep
Post by nus1998
HI Denis,
Thanks for the reply.
Even if I don't use "waitForReadyRead" but polling "bytesAvailable" instead,
the later always returns 0 although there is data received and I can use
other terminal software to display it too.
Best regards,
Je
Hi.
Seems it is a bug, see: https://bugreports.qt-project.org/browse/QTBUG-33987
You can test this patch.
Besd regards,
Denis
I found a strange issue, when I read from serial, first I will call
"waitForReadyRead", it returns with true in specified time, however, when I
call "read" function thereafter, I can't read even a byte. the hardware
works fine since I checked it by logic analyzer.
env: win7 64, qt 5.1 mingw version
thanks
Je
----
from iPad
_______________________________________________
Interest mailing list
http://lists.qt-project.org/mailman/listinfo/interest
_______________________________________________
Interest mailing list
http://lists.qt-project.org/mailman/listinfo/interest
Denis Shienkov
2013-10-16 11:39:49 UTC
Permalink
nus1998
2013-10-16 12:08:12 UTC
Permalink
Hi,

No offence but I don't think it's the matter of blocking or non-blocking. Also I don't think waitForBytesWritten is a "MUST" as long as I wait enough time before next transmission.

If QSerialPort is correct, I can only say that these APIs are out of my common sense.

Best regards,
Je




At 2013-10-16 19:39:49,"Denis Shienkov" <***@yandex.ru> wrote:

Hi.

1. Do not use the blocking approach for the GUI app.
2. After write() you should do waitForBytesWritten() or flush() in case of blocking approach.

Summary: Use the non-blocking approach with the readyRead signal and do not use the waitForXXX() methods!

Best regards,
Denis



16.10.2013, 12:24, "nus1998" <***@yeah.net>:
Hi, the simple code is followed, I use wizard to generate qt gui application in widget method
for "#if 1", the message is "port open, A, A, done", for "#if 0", the message is "port open, A, B, done"

#include<QDebug>
#include<QtSerialPort/QtSerialPort>

Widget::Widget(QWidget*parent):
QWidget(parent),
ui(newUi::Widget)
{
ui->setupUi(this);

QSerialPort*port=newQSerialPort(this);
charc1,c2;

port->setPortName("COM4");
if(port->open(QIODevice::ReadWrite))
{
port->setBaudRate(QSerialPort::Baud9600);
port->setDataBits(QSerialPort::Data8);
port->setStopBits(QSerialPort::OneStop);
port->setParity(QSerialPort::NoParity);
port->setFlowControl(QSerialPort::NoFlowControl);
qDebug()<<"portopen";
}
else
qDebug()<<"portopenerror";

port->clear();
c1='A';
port->write(&c1,1);
port->waitForReadyRead(3000);
port->read(&c2,1);
qDebug()<<c2;

c1='B';
port->write(&c1,1);
#if1
port->waitForReadyRead(3000);
#else
port->waitForReadyRead(100);
port->waitForReadyRead(100);
#endif
port->read(&c2,1);
qDebug()<<c2;
qDebug()<<"done";
}









At 2013-10-16 16:08:04,"Denis Shienkov" <***@yandex.ru> wrote:

Hi.
Post by nus1998
I just test it, so I think blocking method is not the issue. and even when I use "connect(m_serial, SIGNAL(readyRead()), this, SLOT(serialRead())); "
mostly the serialRead slot can read nothing too..

Seems, you do something wrong.
Post by nus1998
waitForReadyRead(1000);
read(data, 1);
Same...

Please provide the simple test application (sources) to reproduce the problem.

Best regards,
Denis


16.10.2013, 12:03, "nus1998" <***@yeah.net>:
Hi,

I just test it, so I think blocking method is not the issue. and even when I use "connect(m_serial, SIGNAL(readyRead()), this, SLOT(serialRead())); "
mostly the serialRead slot can read nothing too..

I tested the following two sample on a loopthrough uart, which make me confused since there is no timeout error for both test.

Can't read data:

waitForReadyRead(1000);

read(data, 1);


Can read data:
waitForReadyRead(100);
waitForReadyRead(100);
waitForReadyRead(100);
waitForReadyRead(100);

read(data, 1);


.
Best regards,
Je










At 2013-10-16 15:50:57,"Denis Shienkov" <***@yandex.ru> wrote:

Hi.

You wrong do it, because it isn't recommended to use the waitForXXX() methods from an main GUI thread.

You should use the non-blocking approach because it is preferred way, e.g. see the Terminal example or Master and Slave Examples from the QtSerialPort sources.

Best regards,
Denis


16.10.2013, 07:51, "nus1998" <***@yeah.net>:
I write a workaround function as below which now works although the actual timeout doesn't match with "TIMEOUT" since sometimes "waitForReadyRead" will return immediately without data available. I have patched "https://codereview.qt-project.org/#patch,sidebyside,67962,2,src/serialport/qserialport_win.cpp" yet.


boolWidget::waitBytes(qint64n)
{
for(inti=0;i<TIMEOUT;i++)
{
if(m_serial->bytesAvailable()>=n)
returntrue;

m_serial->waitForReadyRead(1);
}

returnfalse;
}
Post by nus1998
You can also try doing a raw read (non Qt way) on the device using
open/read system calls and check if data is actually available.
That'll make sure that the OS is indeed receiving data and the problem
can then be isolated to QSerialPort.
HTH,
-mandeep
Post by nus1998
HI Denis,
Thanks for the reply.
Even if I don't use "waitForReadyRead" but polling "bytesAvailable" instead,
the later always returns 0 although there is data received and I can use
other terminal software to display it too.
Best regards,
Je
Hi.
Seems it is a bug, see: https://bugreports.qt-project.org/browse/QTBUG-33987
You can test this patch.
Besd regards,
Denis
I found a strange issue, when I read from serial, first I will call
"waitForReadyRead", it returns with true in specified time, however, when I
call "read" function thereafter, I can't read even a byte. the hardware
works fine since I checked it by logic analyzer.
env: win7 64, qt 5.1 mingw version
thanks
Je
----
from iPad
_______________________________________________
Interest mailing list
http://lists.qt-project.org/mailman/listinfo/interest
_______________________________________________
Interest mailing list
http://lists.qt-project.org/mailman/listinfo/interest
Denis Shienkov
2013-10-16 12:40:07 UTC
Permalink
Denis Shienkov
2013-10-16 07:47:07 UTC
Permalink
Loading...