スキップしてメイン コンテンツへ

 none
WinUSBでPurgeCommと同等の機能を実装したい RRS feed

  • 質問

  • ハードウェアの仕様で、コマンド送信前に入力バッファをクリアする必要があります。

    ヘルプを呼んでも、PurgeCommに相当する関数が見当たらないので困っております。

    WinUSBでバッファをクリアする方法はないのでしょうか?

    最悪、現在のバッファ数がわかれば、その分をリードできるのですが、

    こちらの方法もわかりませんでした。

    併せて、おしえていただけないでしょうか。

    • 移動 Mike Wang (MSCS) 2012年10月2日 12:48 (移動元:Windows デバイスドライバー開発)
    2011年2月23日 10:30

回答

  • 返信遅くなりましたが、

    デバイスから送信された後に実行しても削除されていませんでした。

    仕方がないので、バッファをクリアする回数を減らしてもらって、

    クリアするタイミングで、バッファ内部のデータをすべてをReadすることで対応しました。

    2011年9月16日 14:25

すべての返信

  • ゆずゆずさん、こんにちは。

    下記の USB function は PurgeComm に相当しませんでしょうか。

    WinUsb_FlushPipe Function
    http://msdn.microsoft.com/en-us/library/ff540227(VS.85).aspx

    The WinUsb_FlushPipe function discards any data that is cached in a pipe.

    勘違いしておりましたらご容赦ください。

    2011年2月23日 12:21
  • peiri さん、ありがとうございます。

    WinUsb_FlushPipe は、試しましたが、

    バッファはクリアされていませんでした。

     CFile::Flush など、ファイル系でFlush というと

    バッファに残っているデータを強制的に書き込むという意味なので、

    discard (破棄)というより、キャッシュのデータを強制的に送信させる(Flush)という意味なのかなと感じています。

    (間違っていたらご指摘ください)

     

    (なぜか、上半分だけ太字を直せません・・・ )

     

    2011年2月24日 13:35
  • 私は試したことがないので、ご希望の動作ができるかどうかわかりませんが、

    WinUsb_SetPipePolicy() の ALLOW_PARTIAL_READSか、あるいはALLOW_PARTIAL_READSをAUTO_FLUSHと組み合わせて試してみてはどうでしょうか。

    2011年3月1日 0:52
    モデレータ
  • 投稿されてからかなりの時間が経過しているので、既に解決されているようでしたら
    ご容赦ください。

    ゆずゆずさんの作成されているモジュールでは WinUSB を使用されているとのことですが、
    ドライバ / アプリのどちらを開発されているのでしょうか?
    もし WinUSB を使ったアプリを開発されているのでしたら、ちょっと話は変ってくると思います。
    例えば、仮にアプリを開発されているのだとしたら。。。

    アプリからは発行済みで、ドライバ側でのまだ未処理の I/O が、コマンド送信の
    直前で処理されて、バッファにセットされてしまっている。

    なんてことはないのかな?。。。。と思った次第際です。

    勘違いしておりましたら、ご容赦ください。

    2011年3月4日 13:07
  • 返信が遅くなりましたが、

    いずれの方法でも解決することができませんでした。

    2011年9月16日 14:20
  • 返信遅くなりましたが、

    デバイスから送信された後に実行しても削除されていませんでした。

    仕方がないので、バッファをクリアする回数を減らしてもらって、

    クリアするタイミングで、バッファ内部のデータをすべてをReadすることで対応しました。

    2011年9月16日 14:25