2012/02/19

[libusb]win32版のlibusb-1.0でCRCエラーが発生するのは受信バッファのせいか

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 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。