標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第429回]

●ReadFile成功

HIDのテストプログラムを実装したPIC18F4550に対して、データを送信することには成功したのですが([第421回])、WriteFileがうまくいったのだから、ReadFileもうまくいくはず、のところがデータの受信についてはさっぱりだめで、なにをどうやっても、うんともすんとも言ってくれません。
この10日ほどというもの、毎日ReadFileと取り組んでおりました。
HIDは簡単だなんて、ウソばっかり。
どうしてどうしてなかなかに手ごわいです。

でもでも、前にも書きましたように、同じところを堂々めぐりしているようでも、あきらめないで追求を続けていますと、ある日突然ぽっかりと穴があいて、いきなり青空が見えたように、「わかったぞお」という瞬間がやってきます。

今回のHIDでの受信テストもまったくその通りで、どうにもならなかったものが、突然クリアできてしまいました。



上の画面コピーのDOS窓が、そのテストをおこなっている画面です。
パソコン側のプログラムはBorland C++で作成しています。
最初に64バイトのデータを(画面に表示したあとで)WriteFile関数でPIC18F4550に送ります。
PIC18F4550はデータを受信するとすぐにそのデータをそのままパソコンに向けて送信します。鸚鵡返しです。
パソコン側はReadFile関数で受信したデータを画面に表示します。

送信データ、受信データは、ともに1バイトずつ16進数で表示しています。
実際に送受信されるデータは64バイトなのですが、WriteFile、ReadFile関数は、データ列の先頭に1バイトのコントロールデータが必要です。この値は0にします。

それにしても、このデータ列は一体なんなのか?
と不審に思われるかもしれません。
じつはこのデータには、今回の解決に結びついた「ある意味」があるのです。
それについては今後、説明が進むにつれて明らかになってきます。
とにかく、WriteFileで送ったデータを、そのままReadFileで受信することができました。

いったいなぜReadFileがうまくできなかったのか?
そしてそれをどうやって解決したのか?
そのあたりのことにつきましては、次回から、少しずつ順を追って説明をしていきます。

●HIDの送信速度は?

データの送信と受信に成功したとなると、さっそく試してみたいのが、これです。
一体HIDでの送受信速度はどれほどのものなのか?
送信の単発テストを行った結果については、以前([422回])にご報告をいたしました。
でもちょっと期待に反する結果で、ややがっかりするような数字になってしまいました。

今回は、送信だけではなくて、受信もできるようになったのですから、送信と受信を繰り返し実行して、その間の時間を測れば、HIDの送受信速度がわかるはずです。



さっそくパソコン側のプログラムを一部書き直してテストをしてみました。
64バイトのデータの送信と受信をセットにして、10000回繰り返して実行し、経過時間を測りました。
それが画面右のDOS窓の表示です。
時間の計測にはclock()とtime()を使いました。
なんでもclock()は、そのプロセスがCPUを占有した、実際の処理時間をms単位で計測するのだそうで、これに対して、time()は実際の時計としての経過時間(時刻)を秒単位で計時するのだそうです。
両者に差がでるかも、と思って両方を使ってみました。
結果はご覧の通り、目立つほどの差にはなりませんでした。
ということは、CPUのほとんどを、この送受信プログラムが占有していた、ことになると思います。

それはともかくとして、結果の分析です。
64バイトのデータを送信、そして受信して、それを10000回繰り返したのですから、その間にUSBケーブルを使って相手に送ったデータは、64×2×10000=1280000バイトになります。
そしてその送受信にかかった時間は24秒ですから、その時間で割ると、
1280000/24=53333(バイト/秒)になります。
おお。今回はかなりいい数字になりました。
約53KB/秒です。
HIDでの計算上の最高の通信速度は64KB/秒ですから([第428回])、計算上の最高速度の8割を超えるパフォーマンスです。
おお。HIDも結構やるじゃないの。

しかしながら、この数字にも、実は意外なウラがありました。
それにつきましてはまた次回。
2010.2.3upload

前へ
次へ
ホームページトップへ戻る