4

HIDデバイスとのデータ転送セッションの終了時に、ソフトウェアは関数WriteFileで約20%の確率で停止します。

これはC#で書かれており、なぜこれが起こっているのか理解できません。パケットあたり20%のエラー率は単純に受け入れられず、その根底に到達するのに苦労しています。それが私の宣言またはデータ型に何かあるのではないかと思っていました。

これはインポートです

[DllImport("kernel32.dll")] 
    static public extern int WriteFile(int hFile, ref byte lpBuffer, int nNumberOfBytesToWrite, ref int lpNumberOfBytesWritten, int lpOverlapped);

そして、これは停止している関数の呼び出しです

Result = USBSharp.WriteFile(hidHandle, ref outputReportBuffer[0], outputReportBuffer.Length, ref NumberOfBytesWritten, 0);

ハンドルは有効であることが確認され、残りはかなり自明です...

関数は単に戻りません。私はこの問題をオンラインでいくつかの異なる場所で調べましたが、ほとんどの場合、誰の修正も適用されません。スレッド化して失敗した場合は再度呼び出すだけですが、数百のパケットで20%の時間を実行するのは、単純に...ひどいことです。

私はWindows7、C#、. NET 4.0を使用していますが、HIDデバイスは停止していませんが、アクティブで実行されています-それだけでなく、データ転送全体が適切に行われ、この呼び出しはトランザクションを完了するために最後に行われます。その後、停止します(すでにすべてのデータがありますが)。残念ながら、このデータは100%維持する必要があるため、トランザクションのこの最後の部分を無視することはできません。そうしないと、ユーザーに悪い、悪い、悪いことが起こります。

4

3 に答える 3

5

問題が解決しない場合は、タイムアウトメカニズムの実装を検討してください。

var stream= new FileStream(hidHandle,FileAccess.Write,false);
var waitEvent= new ManualResetEventSlim();

void Write(byte[] report, int timeout){
    waitEvent.Reset();
    stream.BeginWrite(report,0,report.Lenght,(ar)=>{stream.EndWrite(ar);waitEvent.Set();},null);
    waitEvent.Wait(timeout);
}
于 2012-09-27T20:16:47.163 に答える
3

USB ドライバ ライブラリに問題があるようです。それがあなたの状況で唯一のユニークな変数です。(たとえば、多くの人が USB ドライブで WriteFile を問題なく使用しています)。

Florian Leitner にサポートを依頼するか、USB デバイスに接続する別の方法を見つけることをお勧めします。Forian は、 USBSharpクラスとScott Hanselman の記事を使用することを詳しく説明しているため、これらは最初から適切な代替手段になる可能性があります。

于 2012-09-27T20:26:50.113 に答える
2

ここで何が問題なのかを推測するのは困難ですが、ここで確認/試行することが重要なことがあります。

安全でないコンテキスト内からCreateFile、WriteFileを呼び出しているかどうかを確認してください 。 アンセーフ コードの詳細を読む そして、このアンセーフ コンテキストを作成するには、次のようにアンセーフ キーワードを使用します。

unsafe static void writeMyFile(...){
...
}

次のように、プロジェクト プロパティのオプション (安全でないコードを許可する) も確認します。 安全でないコードを許可する

これが役立つことを願っています。

于 2012-09-27T16:31:29.350 に答える