HID(キーボードもどき)で一文字ずつ送ってみた。 [USB]
まるで昨日の結果と変わらない、「捏造?」と思われてしまうかも知れないけれど、新しいプログラムの結果です。以下の関数を書き換えてみました。
うーん!イメージとしては、6byteまとめての場合は一行一行がパッ、パッ、パッって表示されるんだけれど、このプログラムの場合は、やはり一文字ずつと言うのが目に見えて判ります。と言ってもタイピング速度は私なんかよりも遥かに早いのですが。
※もう一つ!
昨日のバッファ6byte使って送信するプログラムで”aaabbb”みたいなパターンが正常に入力されたのはWindowsの2Kでした。
先程同じプログラムをWindowsのXPでやってみたところ、”aaabbb”は”ab”と縮小されてしまいました。
と言う訳で、最初から1byteずつ送る方法が一番安全ですが、まとめて送る時は、バッファ中に同じデータが存在しない様に処理をする必要が有りますね。
2KとXPでこれだけ動作に違いが有るので、VISTAだったらどうなる事やら。持っていないから判らないけれど。
※更に更に追試
では”ababab”ならどうなるか?。XPでやってみましたら、”abababcdefghijklmnopqrstuvwxyz”となりました。
そこで勝手に推測すると、XPの場合はまずバッファの先頭から評価、ここで連続データは一定以上の連続で無い限りリピートとは判断せず、1個のデータとして見る。
しかしバッファの中で連続しないで同一データが配置されている時は、チェックがルーズなので、同一データとしては見ていない。ちなみに2Kはもっとルーズ。
あくまでも勝手な想像ですからね。
まだまだ続くぞ!多分。
void Str2PC( const char *str ) { int i; char *ptr; char old,dst[ 40 ]; (void)Str2Keycode( dst, str ); (void)memset( &KbBuffer[0], 0, 8 ); /*一度バッファ全てをクリアする*/ for( i = strlen( str ), ptr = dst, old = 0; i > 0; ) { wait(); if( *ptr != old ) /*前回と異なる時*/ { KbBuffer[ 2 ] = *ptr++; i--; } else { KbBuffer[ 2 ] = 0; } old = KbBuffer[ 2 ]; /*送信したデータを記憶して置く*/ } wait(); KbBuffer[ 2 ] = 0; }
うーん!イメージとしては、6byteまとめての場合は一行一行がパッ、パッ、パッって表示されるんだけれど、このプログラムの場合は、やはり一文字ずつと言うのが目に見えて判ります。と言ってもタイピング速度は私なんかよりも遥かに早いのですが。
※もう一つ!
昨日のバッファ6byte使って送信するプログラムで”aaabbb”みたいなパターンが正常に入力されたのはWindowsの2Kでした。
先程同じプログラムをWindowsのXPでやってみたところ、”aaabbb”は”ab”と縮小されてしまいました。
と言う訳で、最初から1byteずつ送る方法が一番安全ですが、まとめて送る時は、バッファ中に同じデータが存在しない様に処理をする必要が有りますね。
2KとXPでこれだけ動作に違いが有るので、VISTAだったらどうなる事やら。持っていないから判らないけれど。
※更に更に追試
では”ababab”ならどうなるか?。XPでやってみましたら、”abababcdefghijklmnopqrstuvwxyz”となりました。
そこで勝手に推測すると、XPの場合はまずバッファの先頭から評価、ここで連続データは一定以上の連続で無い限りリピートとは判断せず、1個のデータとして見る。
しかしバッファの中で連続しないで同一データが配置されている時は、チェックがルーズなので、同一データとしては見ていない。ちなみに2Kはもっとルーズ。
あくまでも勝手な想像ですからね。
まだまだ続くぞ!多分。
2008-03-14 21:48
nice!(0)
コメント(5)
トラックバック(0)
8msecごとに一文字送られる。一秒間に125文字の割合。一文字あたり12ビット時間が必要と仮定すると、1500baud相当の表示速度ということになりますか。
その昔、BBSなどやっていた時には、300baud、早くても1200baudだったから、それに比べれば十分に早いかと。
最近の15200baudの端末と比べられたら、カワイソすぎます。
by noritan (2008-03-15 00:22)
まあそうなんですよね、キーボードですし。
あと、結論としてはバッファ詰め詰め作戦より、1byte単位で書いた方が良いという事かな。
現在のプログラムでは、英字は小文字しか対応していないので、大文字に対応させるには1byte単位での書き込みの方が都合が良い。
次は、日本語変換を起動して、日本語で記述にチャレンジかな。
変換候補をどう選ぶのかが最大の問題だけど。
by hamayan (2008-03-15 01:03)
いやあ、楽しんでますね。
スピードを追求するなら、フルスピード(12Mbps)やハイスピード(480Mbps)のUSB MCUに換えてしまうのが簡単なんでしょうが、このチップで何とかするところに面白みがあるんでしょうね。
最近、こういう遊び心を忘れていました。
Tsuneo
by Tsuneo (2008-03-15 10:05)
どうせUSBのスペック無視でいくのなら、エンドポイント・デスクリプタの bInterval を 1(ms) に設定してみてはどうですか。PCのハイスピードのポートに USB2.0 ハブ経由でつないであれば、エニュメレーション時のチェックもいいかげんになるので、結構だまくらかせると思いますよ。
Tsuneo
by Tsuneo (2008-03-15 17:48)
了解です。それも楽しい実験シリーズに入れます。
by hamayan (2008-03-15 22:39)