2009-03-23 20 views
2

シリアルI/OにIO完了ポートを使用することはできますか? C/C++経由のWindowsによれば、それは可能であることを暗示しています。また、CreateFile、ReadFile、WriteFileなどで動作する物理ファイルでIOCPを使用する例を挙げています。しかし、これはシリアル通信で実際に動作しますか?それは働いている?IOCPによるシリアル通信

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

答えて

3

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

セットアップは、基本的には、次のとおりです。CreateFile()dwFlagsAndAttributesパラメータとしてFILE_FLAG_OVERLAPPED値を渡すと

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

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

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

+0

ああ。私はおそらく私が間違っていた場所だったGetCommTimeoutsを使用していませんでした - 私は接続を形成することができますが、何も渡すことはできません。 –

+0

CancelIo()は完全に壊れています。詳細については、http://stackoverflow.com/questions/3921111/how-to-find-out-when-cancelio-is-doneを参照してください。 – Gili