QextSerialPort::read() не возвращается до истечения времени ожидания, но данные доступны

Я использую QextSerialPort с Qt 4.8.1 на Win32. Когда установлен режим запроса "опрос", а время ожидания установлено с помощью 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 ответа

Я думаю, проблема в QIODevice::read(char *data, qint64 maxSize) функция из файла qiodevice.cpp:

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 функция.

Похоже, решение состоит в том, чтобы открыть в небуферизованном режиме таким образом:

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

Я не совсем уверен, почему это необходимо, поэтому, если кто-то сможет пролить свет на философию этого дизайна интерфейса, меня все равно будут интересовать любые ответы.

Я уверен, что QExtSerial использует ReadFile() в Windows.

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

Возвращена ли строка ошибки? qextserialport->errorString();

Может быть, ReadFile() зависает, но не до тех пор, пока он не вставит данные в указатель?

Другие вопросы по тегам