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 nus1998I 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 nus1998waitForReadyRead(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 nus1998You 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 nus1998HI 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