3

COMポートと通信するためのターミナルを作成する必要があります。また、COMポートとコンソールから同時にコマンドを送信できる必要があります。(ワイヤレスで相互に通信している2つのセンサーノードを介してコンピューターにアクセスしたいので、ノードからコンピューターに何かを送信する方法が必要です)

今、私は非重複シリアル通信を実装しましたが、「送信と受信を同時に」実装する方法がわかりません-パートと私は問題を解決するのに約4日しかありません。そこにはそれほど多くの情報がないので、その最速または最も簡単な方法を実装する方法についてのポインタを歓迎します。

重複したI/O-通信は、私が見る限り、正確には時間にやさしいものではありません。マルチスレッド(オーバーラップのみ)でこれを行うことは可能ですか?その場合、数ミリ秒ごとにバッファを読み取り、入力用に独自のスレッドを作成する必要があると思いますか?

4

1 に答える 1

2

オーバーラップ I/O を使用するかどうかは、実際には問題ではありません。オーバーラップは、プログラムの時間を解放するだけです。私はこのようなプログラムをたくさん書いてきましたが、結論は常にスレッドを使用してすべての COM ルーチンを処理することです。スレッドが WaitForMultipleObjects() を実行してアイドル状態にある限り、このスレッドがオーバーラップ メソッドまたは同期メソッドを呼び出すかどうかはあまり重要ではありません。

私が最近の COM 端末を書いた方法は次のとおりです (疑似):

thread()
{
  while not kill the thread event
  {
    WaitForMultipleObjects (open port, close port, kill the thread event)

    if (open port)
    {
      send();
      receive();
      wait_for_send_and_receive();
    }
  }  
}

send()
{
  take COM_port mutex
  if(there is something to send)
  {
    copy send_data to local_data, protect this with mutex
    WriteFileEx(COM_port,
                local_data,
                size,
                some_overlapped_struct_stuff);

    handle errors

  }
  release COM_port mutex
}

receive()
{
  take COM_port mutex

  ReadFileEx(COM_port, ...);

  handle errors

  release COM_port mutex
}

wait_for_send_and_receive()
{
  WaitForMultipleObjects (open port, 
                          close port, 
                          kill the thread event,
                          send done event from send callback routine (overlapped I/O),
                          receive done event from receive callback routine (overlapped I/O)
                         );

}

当然のことながら、COM ポートの開閉、データのシャッフルなどにさまざまな関数が必要になるため、これは非常に単純化されすぎています。

それが企業の所有物でなければ、実際に動作する製品コードを共有したいと思います:(私のプロジェクトログから判断すると、4日は少し楽観的に思えます.動作するCOMポートターミナルを製品品質レベルに開発するのに数ヶ月かかりました. COM ポート ドライバーだけでも約 1k loc であり、多くの Win API 呼び出しがあちこちにあります。

于 2012-08-10T09:36:58.557 に答える