2

シリアル I/O に IO Completion Ports を使用することはできますか? WindowsによるC / C ++によると、可能であることがほのめかされており、CreateFile、ReadFile、WriteFileなどでの作業を示す物理ファイルでIOCPを使用する例を示しています。ただし、これは実際にシリアル通信で機能しますか?それは働いていますか?

ウェブ上でこれの例を見つけることはできませんが、私が最初に試みたわけではありませんか?

4

1 に答える 1

3

はい、シリアル I/O 用の I/O 完了ポートを使用すると問題なく動作します。IOCP に適したシリアル ポートのファイル ハンドルを作成するには、セットアップ作業が必要です。ただし、セットアップが完了すると、通常のファイル ハンドルやソケット ハンドルと同様に、非同期操作ReadFile()や操作を行うことができます。WriteFile()

セットアップは基本的に次のとおりです。

  1. パラメータとして値をCreateFile()渡してシリアルポートを開きます。FILE_FLAG_OVERLAPPEDdwFlagsAndAttributes
  2. GetCommState()とを使用して、必要に応じてシリアル ポートの状態を変更しSetCommState()ます。これは、IOCP を使用しない場合と同様に行います。
  3. GetCommTimeouts()およびを使用しSetCommTimeouts()て、読み取り操作の合計タイムアウトをオフにします。これは、通常、非同期操作にタイムアウトを設定する意味がないためです。(代わりに、読み取り操作をキャンセルするために明示的に呼び出すCancelIO()必要があります。) total-timeouts をオフにするには、構造体のフィールドReadTotalTimeoutMultiplierReadTotalTimeoutConstantフィールドCOMMTIMEOUTSをゼロに設定します。

これで、通常のファイル ハンドルやソケット ハンドルと同じように、ハンドルを IOCP で使用できるようになりました。つまり、 を使用してハンドルを完了ポートにアタッチし、構造体を使用してCreateIoCompletionPort()I/O 操作を開始し、関数を使用して完了ポートから完了、失敗、またはキャンセルされた操作をデキューします。ReadFile()WriteFile()OVERLAPPEDGetQueuedCompletionStatus()

関数を使用して、追加のシリアル ポート固有のイベントを非同期に取得することもできますWaitCommEvent()

于 2009-04-16T23:55:52.140 に答える