2011-07-12 16 views
2

COMポートに接続されているデバイスからデータを読み取ろうとしています。通信リソースからの読み取り

  • HANDLE handle =CreateFileW(L"\\\\.\\COM3", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);

    くれ、その後GetCommStateSetCommStateを介して設定された有効なHANDLEを与えます。

  • OVERLAPPED ol = {0};

    char buffer[1024];

    ol.Offset = 0;

    ol.OffsetHigh = 0;

    ReadFileEx(handle, buffer, 1, &ol, NULL);

    問題は、この呼び出しが成功しないということであり、そしてGetLastError()は87(ERROR_INVALID_PARAMETER)を返します。

デバイスから読み取れるようにするにはどうすればよいですか?

答えて

1

ReadFileExのドキュメントは

ReadFileEx関数はOVERLAPPED構造体のhEvent メンバーを無視すると述べています。アプリケーションは、ReadFileEx呼び出しのコンテキストで、その目的のためにそのメンバーを自由に使用することができます。 ReadFileExは の完了を、 ルーティンがlpCompletionRoutineが指している補完ルーチンを呼び出すか、または呼び出しをキューイングすることによってその信号を読み取るので、 イベントハンドルは必要ありません。

したがって、完了ルーチンはオプションであるとも言われていますが、おそらく必要です。あなたがリンクしているページの下部にあるコミュニティーのコメントにも注意してください。 - MSはNULL lpCompletionRoutineをエラーとみなしてクラッシュを修正した可能性があります。しかし、私はそれを検証するためにテストしていません。

完了ルーチンを使用していない場合は、重複した操作に通常のReadFileを使用できます。

+0

'ReadFileはこの問題を解決しました。ありがとう! – Etan

1

MSの実装には、ReadFileExというバグもあります。 BOOLの返品結果について完全に返信するべきではないことと、GetLastError()もチェックする必要があることを明示する文書にもかかわらず、実装は既存のエラーをクリアできません。 ReadFileEx()を呼び出す前にSetLastError(ERROR_SUCCESS)を追加してください。

関連する問題