Windows版のlibusb-1.0で、CRCエラーが発生したことになっている。
わからないままにするのは嫌なので、調べることにした。
ソースは、ここから。
git://git.libusb.org/libusb-pbatard.git
libusb:error [windows_transfer_callback] detected I/O error: [23] データ エラー(巡回冗長検査 (CRC) エラー) です。
libusb:warning [do_sync_bulk_transfer] unrecognised status code 1
こんなログだ。
出るのは受信時だけで、送信時には出ていない。
ソースでは、windows_usb.cのwindows_transfer_callback()。
名前からすると、転送完了通知みたいなものだろうか。
引数でエラーが返ってきていて、それを単に出しているだけのようだ。
アンダーラインを引いたエラーの文言は、GetLastError()で取ってきているだけなので、WindowsがCRCエラーと判断しているように見える。
libusbソースを"crc"で検索しても見つからないので、そこら辺はアプリ以下でやってくれていると考えて良かろう。
しかし、SnoopyProでの通信を見る限り、エラーが発生している気配がない。
いや、SnoopyProでエラーが見えるのかどうかは知らないけれども、エラーが発生したら何かいいそうではないか。
雑誌InterfaceのUSB特集を見ると、バルクINでCRCがあるのはデータパケットのようだ。
しかし・・・Windowsがそういう低レベルのエラーを上げてくるのか?という気がする。
リトライとかしてその結果を上げてきそうだし、そのときも「データ不正」とかそんなエラーで、いちいちCRCが違っていた、なんてことは言わないんじゃないだろうか。
推測に過ぎないがね。。。
Linuxなら動くだろう、と試してみたが、あらら、動かない。
こっちは-75というエラー。
どうやら、バッファオーバーフローの意味らしい。
検索すると、受信バッファが実際のデータよりも小さいと発生するようだ。
そんなわけで、受信バッファを増やすと、LinuxもWindowsもエラーが出なくなった。
なるほどねぇ。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。