シリアル I/O に IO Completion Ports を使用することはできますか? WindowsによるC / C ++によると、可能であることがほのめかされており、CreateFile、ReadFile、WriteFileなどでの作業を示す物理ファイルでIOCPを使用する例を示しています。ただし、これは実際にシリアル通信で機能しますか?それは働いていますか?
ウェブ上でこれの例を見つけることはできませんが、私が最初に試みたわけではありませんか?
シリアル I/O に IO Completion Ports を使用することはできますか? WindowsによるC / C ++によると、可能であることがほのめかされており、CreateFile、ReadFile、WriteFileなどでの作業を示す物理ファイルでIOCPを使用する例を示しています。ただし、これは実際にシリアル通信で機能しますか?それは働いていますか?
ウェブ上でこれの例を見つけることはできませんが、私が最初に試みたわけではありませんか?
はい、シリアル I/O 用の I/O 完了ポートを使用すると問題なく動作します。IOCP に適したシリアル ポートのファイル ハンドルを作成するには、セットアップ作業が必要です。ただし、セットアップが完了すると、通常のファイル ハンドルやソケット ハンドルと同様に、非同期操作ReadFile()
や操作を行うことができます。WriteFile()
セットアップは基本的に次のとおりです。
CreateFile()
渡してシリアルポートを開きます。FILE_FLAG_OVERLAPPED
dwFlagsAndAttributes
GetCommState()
とを使用して、必要に応じてシリアル ポートの状態を変更しSetCommState()
ます。これは、IOCP を使用しない場合と同様に行います。GetCommTimeouts()
およびを使用しSetCommTimeouts()
て、読み取り操作の合計タイムアウトをオフにします。これは、通常、非同期操作にタイムアウトを設定する意味がないためです。(代わりに、読み取り操作をキャンセルするために明示的に呼び出すCancelIO()
必要があります。) total-timeouts をオフにするには、構造体のフィールドReadTotalTimeoutMultiplier
とReadTotalTimeoutConstant
フィールドCOMMTIMEOUTS
をゼロに設定します。これで、通常のファイル ハンドルやソケット ハンドルと同じように、ハンドルを IOCP で使用できるようになりました。つまり、 を使用してハンドルを完了ポートにアタッチし、構造体を使用してCreateIoCompletionPort()
I/O 操作を開始し、関数を使用して完了ポートから完了、失敗、またはキャンセルされた操作をデキューします。ReadFile()
WriteFile()
OVERLAPPED
GetQueuedCompletionStatus()
関数を使用して、追加のシリアル ポート固有のイベントを非同期に取得することもできますWaitCommEvent()
。