QextSerialPort :: read()在超时到期之前不会返回,但数据可用

时间:2012-10-18 16:43:39

标签: windows qt qextserialport

我在Win32上使用QextSortPort和Qt 4.8.1。设置“轮询”查询模式时,使用QextSerialPort :: setTimeout()设置超时。当我调用QExtSerialPort :: read()时,即使数据可用,读取函数也不会返回,直到整个超时期限到期,即使它返回数据。

例如:

m_port->setTimeout( 3000 ) ;
char data = 0 ;
int count = m_port->read( &data, 1 ) ;
// Returns after three seconds, but count is 1, and data set as expected

我希望它会在指定的数字或字节读取超时到期后立即返回 - 这是首先发生的。

这应该工作还是我误解了这个界面?有没有办法在轮询模式下实现预期的行为。

3 个答案:

答案 0 :(得分:0)

似乎解决方案是以无缓冲模式打开:

m_port->open( QIODevice::ReadWrite | QIODevice::Unbuffered ) ;

我不确定为什么这应该是必要的,所以如果有人能够阐明这种界面设计的理念,我仍然会对任何答案感兴趣。

答案 1 :(得分:0)

我很确定QExtSerial在Windows上使用ReadFile()。

http://msdn.microsoft.com/en-us/library/windows/desktop/aa365467(v=vs.85).aspx

是否返回错误字符串? qextserialport-> Errorstring,则();

也许ReadFile()被挂起但是直到它已经将数据推入指针?

答案 2 :(得分:0)

我认为,问题出在 qiodevice.cpp 文件的QIODevice::read(char *data, qint64 maxSize) 功能中:

qint64 QIODevice::read(char *data, qint64 maxSize)
{
    ...
            if ((d->openMode & Unbuffered) == 0 && maxSize < QIODEVICE_BUFFERSIZE) {
                ...
                int bytesToBuffer = QIODEVICE_BUFFERSIZE;
                ...
                qint64 readFromDevice = readData(writePointer, bytesToBuffer);
                ...
            }
    ...
}

其中QIODEVICE_BUFFERSIZE 16384

readData()功能在 QextSerialPort 中实施,并调用ReadFile() WinApi功能。