首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QextSerialPort::read()直到超时过期才返回,但数据是可用的

QextSerialPort::read()直到超时过期才返回,但数据是可用的
EN

Stack Overflow用户
提问于 2012-10-18 16:43:39
回答 3查看 1.1K关注 0票数 0

我在Win32上使用QT4.8.1的Win32。设置“轮询”查询模式时,使用QextSerialPort::setTimeout()设置超时集。当我调用QExtSerialPort:: read ()时,即使数据可用,读取函数在整个超时期结束之前也不会返回,即使它与数据一起返回。

例如:

代码语言:javascript
复制
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

我希望它在读取指定的一个或多个字节或超时后返回--这是第一次发生的。

这是可行的,还是我误解了这个界面?是否有办法在投票模式下实现预期的行为。

EN

回答 3

Stack Overflow用户

发布于 2012-10-18 17:08:07

解决方案似乎是以非缓冲模式打开,因此:

代码语言:javascript
复制
m_port->open( QIODevice::ReadWrite | QIODevice::Unbuffered ) ;

我不太清楚为什么这应该是必要的,所以如果有人能够阐明这个界面设计的哲学,我仍然会对任何答案感兴趣。

票数 0
EN

Stack Overflow用户

发布于 2012-10-29 23:05:40

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

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

是否返回错误字符串?qextserialport>errorString();

也许ReadFile()被挂起了,但直到它已经将数据推入指针之后才会挂断?

票数 0
EN

Stack Overflow用户

发布于 2014-05-28 16:49:18

我认为,问题是来自QIODevice::read(char *data, qint64 maxSize) functionqiodevice.cpp文件:

代码语言:javascript
复制
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_BUFFERSIZE16384

QextSerialPort实现了readData()函数,并调用ReadFile() WinApi函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12959612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档