0

Win32 の Qt 4.8.1 で QextSerialPort を使用しています。「ポーリング」クエリ モードが設定され、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

指定された数またはバイトが読み取られるか、タイムアウトが期限切れになるとすぐに返されると思います-どちらが先に発生するか。

これは機能するはずですか、それともこのインターフェイスを誤解していますか? ポーリング モードで期待される動作を実現する方法はありますか。

4

3 に答える 3

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);
                ...
            }
    ...
}

16384QIODEVICE_BUFFERSIZEです。_

readData()関数はQextSerialPortに実装され、関数を呼び出しReadFile() WinApiます。

于 2014-05-28T16:49:18.253 に答える
0

QExtSerial が Windows で ReadFile() を使用していると確信しています。

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

エラー文字列は返されますか? qextserialport->errorString();

ReadFile() がハングアップしているのかもしれませんが、ポインターにデータがプッシュされるまではハングアップしていませんか?

于 2012-10-29T23:05:40.430 に答える
0

解決策は、次のように非バッファ モードで開くことです。

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

なぜそれが必要なのかよくわからないので、誰かがこのインターフェース設計の哲学に光を当てることができれば、私はまだ答えに興味があります.

于 2012-10-18T17:08:07.680 に答える