トップ回答者
reader.LoadAsync()がShortPacketの受け取りを失敗する

質問
-
お世話になります。
下記のコードで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 余分の行を削除しました
回答
-
- 回答の候補に設定 栗下 望Microsoft employee, Moderator 2016年12月5日 6:12
- 回答としてマーク 栗下 望Microsoft employee, Moderator 2016年12月6日 1:46
-
私は、'System.Threading.Tasks'の中に何か問題が潜んでいるのではないかと思っております。
そうでしょうか?
単に Task を利用するだけでは起きないと思いますよ、感覚的にはですが…。
試せるのであれば、Async じゃない、同期メソッドに書き換えて再現するかどうか見てみてはどうですか?
それとも再現するなら Task のせいじゃないと断言できるでしょう。私には、それを解決する実力はありません。どなたかこの問題を解決していただけないかと期待しています。
おそらく、難しいと思っています。(現に回答が今まで1つもついていないという状況ですので)
// 英語のスレッドでは MS 側のメンバーがフォローしてくれているみたいなので、そちらに集約で良いかと思います。
デバイス側の問題の可能性を排除できていませんし、再現させるためにはそういったデバイスを手元に用意しなければなりません。
Short Packet でまったく同じ経験がある方が現れるほかは、進展がないと思われますので、私はプレミアサポートの活用の検討を提案した次第です。- 編集済み AzuleanMVP, Moderator 2016年12月6日 12:47
- 回答としてマーク tokiyam 2016年12月6日 16:36
すべての返信
-
- 回答の候補に設定 栗下 望Microsoft employee, Moderator 2016年12月5日 6:12
- 回答としてマーク 栗下 望Microsoft employee, Moderator 2016年12月6日 1:46
-
フォーラムオペレータの栗下 望です。
こんにちは、tokiyam さんAzuleanさんも仰るようにMSDNフォーラム内でも複数のスレッドでご投稿いただいているようですね。
複数個所でご質問いただくと情報が分散して共有できなくなってしまいますのでいずれかのスレッドへ絞って投稿いただけますようお願い致します。よろしくお願いいたします。
MSDN/TechNet Community Support 栗下 望
- 編集済み 栗下 望Microsoft employee, Moderator 2016年12月6日 1:26
-
一方を削除いたしました。また、英語の投稿も削除いたしました。
追加の情報です。
この問題が発生するとアプリは、以下のメッセージで停止します。
//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 補足のため
-
フォーラムオペレーターの栗下 望です。
英語の投稿も削除されたとのことですが、
以下の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 栗下 望
-
私は、'System.Threading.Tasks'の中に何か問題が潜んでいるのではないかと思っております。
そうでしょうか?
単に Task を利用するだけでは起きないと思いますよ、感覚的にはですが…。
試せるのであれば、Async じゃない、同期メソッドに書き換えて再現するかどうか見てみてはどうですか?
それとも再現するなら Task のせいじゃないと断言できるでしょう。私には、それを解決する実力はありません。どなたかこの問題を解決していただけないかと期待しています。
おそらく、難しいと思っています。(現に回答が今まで1つもついていないという状況ですので)
// 英語のスレッドでは MS 側のメンバーがフォローしてくれているみたいなので、そちらに集約で良いかと思います。
デバイス側の問題の可能性を排除できていませんし、再現させるためにはそういったデバイスを手元に用意しなければなりません。
Short Packet でまったく同じ経験がある方が現れるほかは、進展がないと思われますので、私はプレミアサポートの活用の検討を提案した次第です。- 編集済み AzuleanMVP, Moderator 2016年12月6日 12:47
- 回答としてマーク tokiyam 2016年12月6日 16:36
-
質問の最後に書いていました・・・
>これまで、同様にWinUSBを使用して、FORMアプリとして作成していた同種のアプリ(送受信:ShortPacket)が、私が使っているWindows 7 Pro(64bit)からWindows 10 Pro Anniversary(64bit)にアップグレードしたパソコンでは問題なく動くのに、最近購入したパソコンでは、上記の問題(ShortPacketが受信できない)が発生しているとの報告が来ていることです。
・・・に関して分かった事を報告いたします。
これは、USBポートの初期設定が、BIOSにてUSB3.0に設定されていたためでした。これをUSB2.0に切り替えましたら問題なく動作するようになりました。
Raspberry Pi 2 に関しては、ローカルでは動くがリモートでは上記の通りという状況は変わっておりません。