1

シリアル ポートでオーバーラップ I/O を実行するプログラムを使用していますが、受信したデータがアプリケーションによって読み取られない場合があります。私のコードはSetCommMask()andWaitCommEvent()を次のように使用しています:

if(!waiting_for_comm_event)
{
   comm_event_ready = false;
   if(!SetCommMask(port_handle, EV_RXCHAR | EV_ERR | EV_RLSD))
      throw OsException(my_strings[strid_set_comm_mask_failed].c_str());
   rcd = WaitCommEvent(port_handle, &event_mask, &event_control);
   last_error = GetLastError();
   if(rcd && event_mask != 0)
       comm_event_ready = true;
   else if(last_error != ERROR_IO_PENDING)
       throw OsException(my_strings[strid_wait_comm_event_failed].c_str());
   else
       waiting_for_comm_event = true;
  }

このコードは、出力バッファーにデータを書き込んだ後に呼び出されます。この書き込み中にデータを受信する可能性があります。WaitCommEvent()読み取り待ちのデータが既に存在する状態を報告しますか?

4

1 に答える 1

3

ここで質問しなければならない場合、答えを知りたくありません。

いいえ、実際には、将来の Windows バージョンで変更される可能性のある文書化されていない動作に依存していることを意味します。

代わりに、重複した I/O を使用して、受信データとイベントの追跡を開始してから、それらをトリガーするデータを送信できます。

2 つのアプローチ (私はReadFileEx自分のシリアル コードで最初のバリアントを使用します):

  • バックグラウンド (オーバーラップ) 読み取りを発行します。
  • 背景(オーバーラップ)を発行しますWaitCommEvent
  • データを書き込みます。
  • 両方のバックグラウンド操作を待ちます...どちらかが完了すると、処理WaitForMultipleEventsが続行されます。

また

  • 背景(オーバーラップ)を発行しますWaitCommEvent
  • データを書き込みます。
  • バックグラウンド操作を待ちます。
  • ウェイク イベントがデータの受信であった場合は、それを読み取ります。

どちらの場合でも、着信データとエラーは、WriteFile完了する前であっても検出されます。

于 2012-11-08T20:50:15.373 に答える