2

COMポートに接続されたデバイスからデータを読み取りたい。

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

    HANDLEとを介して構成されGetCommStateた有効なものを取得しますSetCommState

  • OVERLAPPED ol = {0};

    char buffer[1024];

    ol.Offset = 0;

    ol.OffsetHigh = 0;

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

    問題は、この呼び出しが成功せず、GetLastError()87(ERROR_INVALID_PARAMETER)を返すことです。

デバイスから何を読み取れるようにすることができますか?

4

2 に答える 2

1

のMS実装にもバグがありReadFileExます。ドキュメントには、返された結果に完全に返信するべきではなく、実装が既存のエラーをクリアできないことBOOLも確認する必要があると明確に記載されていますが。を呼び出す前にをGetLastError()追加します。SetLastError(ERROR_SUCCESS)ReadFileEx()

于 2011-08-07T02:41:03.460 に答える
1

ReadFileExのドキュメントには次のように記載されています

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

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

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

于 2011-07-12T09:06:15.953 に答える