none
reader.LoadAsync()がShortPacketの受け取りを失敗する RRS feed

  • 質問

  • お世話になります。

    下記のコードでWinUSBでのShortPacketを受信しています。

    受信する1パケットのデータ量が6バイト以下ならば問題ないのですが7バイトを超えると例外を発生し困っています。

    これはUWPで作成したUSB通信をRaspberry Pi2(RP2) (Windows 10 IoT)でテストしています。

       public static String gRcv;

       public static Boolean rcvOk = false;

     

       public async static Task BulkRead()

       {

           UInt32 bytesToRead = System.Convert.ToUInt32(64);

           UInt32 bytesRead = 0;

     

           if (OpenFlag == true)

           {

               UsbBulkInPipe readPipe = usbDevice.DefaultInterface.BulkInPipes[0];

               readPipe.ReadOptions |= UsbReadOptions.None;

     

               var stream = readPipe.InputStream;

               DataReader reader = new DataReader(stream);

     

               try

               {

                   bytesRead = await reader.LoadAsync(bytesToRead);    //Number of the receive letters

               }

               catch (Exception exception)

               {

                   DspMessage(exception.Message.ToString());

               }

               finally

               {

                   gRcv = reader.ReadString(bytesRead);

                   if (gRcv == "") { rcvOk = false; } else { rcvOk = true; }

               }

           }

       }

    

    エラーが発生する行は、レム(//Number of the receive letters)のある行です。例外が発生して停止します。一旦これが起こるとRP2を再起動しないと元には戻りません。

    このコードの元ネタは、下のリンクを参照させていただきました。

    https://msdn.microsoft.com/en-us/library/windows/hardware/dn303346(v=vs.85).aspx

    この中のサンプルでは、readPipe.ReadOptions |= UsbReadOptions.IgnoreShortPacket; となっていましたが、このアプリケーションでは、ShortPacket を使う(60バイト以下)ので、readPipe.ReadOptions |= UsbReadOptions.None; としています。

    エラーを避けるため、USBデバイスが送信するデータを6バイト以下にすると全く問題なく動作します(30H連続で送受信を試しました)

    ただし、このUWPアプリをローカルコンピュータで走らせた場合は、そのようなデータ制限をする必要は全くなく、普通に使えます。ローカルコンピュータで動いたのでリモートコンピュータでも動くはずだと思っていたのです。

    これにどのように対処したらよろしいでしょうか?よろしく御教授のほど、お願い致します。

    ----------------

    これに関連して、少し気がかりなことがあります。これまで、同様にWinUSBを使用して、FORMアプリとして作成していた同種のアプリ(送受信:ShortPacket)が、私が使っているWindows 7 Pro(64bit)からWindows 10 Pro Anniversary(64bit)にアップグレードしたパソコンでは問題なく動くのに、最近購入したパソコンでは、上記の問題(ShortPacketが受信できない)が発生しているとの報告が来ていることです。これのINFファイルの一部を下に示します。

    

    [CoInstallers_AddReg]

    HKR,,CoInstallers32,0x00010000,"WdfCoInstaller01009.dll,WdfCoInstaller","WinUSBCoInstaller2.dll,WinUSBCoInstaller"

    [CoInstallers_CopyFiles]

    WinUSBCoInstaller2.dll

    WdfCoInstaller01009.dll

     

    このINFファイルで Windows XP 以来、長い間、使ってまいりました。

    この問題も早急に対処しなければならないのですが、この問題と上記の問題は、何か関連があるのかなと思っております。

    以上、長々と書きましたが、とても困っております。

    どうか、分かられる方、どうぞよろしく御教授ください。


    • 編集済み tokiyam 2016年12月4日 8:44 余分の行を削除しました
    2016年12月4日 8:39

回答

  • これ(日本語) これ(英語) と同じ内容ですよね?

    MSDN フォーラムはフォーラムホームですべてのスレッドが表示される仕様となっていますので、そのフォーラム内の細かなフォーラムを変えたところで、回答状況が変わるわけではありません。

    回答が得られず、かつ早急な対処が必要なのであれば、Microsoft の有償サポートを頼ることも考えてください。
    プレミアサポートであれば、細かな問題の調査や具体的な解決の方向性についてもアドバイスをもらえるかと思います。

    2016年12月4日 9:13
    モデレータ
  • 私は、'System.Threading.Tasks'の中に何か問題が潜んでいるのではないかと思っております。

    そうでしょうか?
    単に Task を利用するだけでは起きないと思いますよ、感覚的にはですが…。
    試せるのであれば、Async じゃない、同期メソッドに書き換えて再現するかどうか見てみてはどうですか?
    それとも再現するなら Task のせいじゃないと断言できるでしょう。

    私には、それを解決する実力はありません。どなたかこの問題を解決していただけないかと期待しています。

    おそらく、難しいと思っています。(現に回答が今まで1つもついていないという状況ですので)
    デバイス側の問題の可能性を排除できていませんし、再現させるためにはそういったデバイスを手元に用意しなければなりません。
    Short Packet でまったく同じ経験がある方が現れるほかは、進展がないと思われますので、私はプレミアサポートの活用の検討を提案した次第です。

    // 英語のスレッドでは MS 側のメンバーがフォローしてくれているみたいなので、そちらに集約で良いかと思います。
    2016年12月6日 12:35
    モデレータ

すべての返信

  • これ(日本語) これ(英語) と同じ内容ですよね?

    MSDN フォーラムはフォーラムホームですべてのスレッドが表示される仕様となっていますので、そのフォーラム内の細かなフォーラムを変えたところで、回答状況が変わるわけではありません。

    回答が得られず、かつ早急な対処が必要なのであれば、Microsoft の有償サポートを頼ることも考えてください。
    プレミアサポートであれば、細かな問題の調査や具体的な解決の方向性についてもアドバイスをもらえるかと思います。

    2016年12月4日 9:13
    モデレータ
  • フォーラムオペレータの栗下 望です。
    こんにちは、tokiyam  さん

    Azuleanさんも仰るようにMSDNフォーラム内でも複数のスレッドでご投稿いただいているようですね。
    複数個所でご質問いただくと情報が分散して共有できなくなってしまいますのでいずれかのスレッドへ絞って投稿いただけますようお願い致します。

    よろしくお願いいたします。


    MSDN/TechNet Community Support 栗下 望


    2016年12月5日 6:07
    モデレータ
  • 一方を削除いたしました。また、英語の投稿も削除いたしました。

    追加の情報です。

    この問題が発生するとアプリは、以下のメッセージで停止します。

    //App.g.i.cs
    #if DEBUG && !DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION
                UnhandledException += (sender, e) =>
                {
                    if (global::System.Diagnostics.Debugger.IsAttached) global::System.Diagnostics.Debugger.Break();
                };
    #endif
    

    私は、'System.Threading.Tasks'の中に何か問題が潜んでいるのではないかと思っております。
    私には、それを解決する実力はありません。どなたかこの問題を解決していただけないかと期待しています。



    • 編集済み tokiyam 2016年12月6日 1:47 補足のため
    2016年12月5日 6:35
  • フォーラムオペレーターの栗下 望です。

    英語の投稿も削除されたとのことですが、
    以下のUSのフォーラムでお話しを続けられているようですね。

    Reception of WinUSB in Raspberry Pi2 is no good.
    https://social.msdn.microsoft.com/Forums/ja-JP/6e6defa7-02e7-4402-b4bc-58263182c6b9/reception-of-winusb-in-raspberry-pi2-is-no-good?forum=WindowsIoT

    前回のご案内後もUSのフォーラムでご質問を継続されているようですので、
    本スレッドにつきましては質問を締め切らせていただいてもよろしいでしょうか?

    どうぞよろしくお願いいたします。


    MSDN/TechNet Community Support 栗下 望

    2016年12月6日 5:04
    モデレータ
  • 私は、'System.Threading.Tasks'の中に何か問題が潜んでいるのではないかと思っております。

    そうでしょうか?
    単に Task を利用するだけでは起きないと思いますよ、感覚的にはですが…。
    試せるのであれば、Async じゃない、同期メソッドに書き換えて再現するかどうか見てみてはどうですか?
    それとも再現するなら Task のせいじゃないと断言できるでしょう。

    私には、それを解決する実力はありません。どなたかこの問題を解決していただけないかと期待しています。

    おそらく、難しいと思っています。(現に回答が今まで1つもついていないという状況ですので)
    デバイス側の問題の可能性を排除できていませんし、再現させるためにはそういったデバイスを手元に用意しなければなりません。
    Short Packet でまったく同じ経験がある方が現れるほかは、進展がないと思われますので、私はプレミアサポートの活用の検討を提案した次第です。

    // 英語のスレッドでは MS 側のメンバーがフォローしてくれているみたいなので、そちらに集約で良いかと思います。
    2016年12月6日 12:35
    モデレータ
  • 了解いたしました。ありがとうございます。

    2016年12月6日 15:08
  • >// 英語のスレッドでは MS 側のメンバーがフォローしてくれているみたいなので、そちらに集約で良いかと思います。

    色々と大変ありがとうございました。そのようにさせていただきます。また、今後の投稿についても、指摘されたことを肝に命じてまいります。

    ただ1つだけ質問させてください。それは、UWPのLOCALではコードは期待通りに動いているのに、REMOTEにすると問題が発生するということは、あり得るということでしょうか?


    • 編集済み tokiyam 2016年12月6日 16:45 最後の質問
    2016年12月6日 15:12
  • 質問の最後に書いていました・・・

    >これまで、同様にWinUSBを使用して、FORMアプリとして作成していた同種のアプリ(送受信:ShortPacket)が、私が使っているWindows 7 Pro(64bit)からWindows 10 Pro Anniversary(64bit)にアップグレードしたパソコンでは問題なく動くのに、最近購入したパソコンでは、上記の問題(ShortPacketが受信できない)が発生しているとの報告が来ていることです。

    ・・・に関して分かった事を報告いたします。

    これは、USBポートの初期設定が、BIOSにてUSB3.0に設定されていたためでした。これをUSB2.0に切り替えましたら問題なく動作するようになりました。

    Raspberry Pi 2 に関しては、ローカルでは動くがリモートでは上記の通りという状況は変わっておりません。

    2016年12月13日 11:02