HIDデバイスと通信する際のタイムアウト設定方法と受信待ちストップの解決策

このQ&Aのポイント
  • HIDデバイスと通信する際にReadFileのタイムアウトを設定したい場合、SetCommTimeoutsは使用できないため、他の方法を探す必要があります。
  • ReadFileは通信モードに入っていないとデバイスからの受信待ちを続けてしまうため、ストップする方法が必要です。
  • HIDデバイスとの通信でタイムアウトを設定する方法や受信待ちでストップしない解決策について、詳細な方法をご教示いただけませんでしょうか?
回答を見る
  • ベストアンサー

HIDでReadFileのタイムアウトを設定したい

PCとUSB接続したHIDデバイスと通信するのに、CreateFileからWriteFile/ReadFileを使用しています。 VID、PIDを頼りに、通信自体は問題なくできています。 ただし、デバイス側のモード切替で、通信モードに入っていないときに問題が発生します。 WriteFileのほうはデバイスがつながってさえいれば送信だけはできるので一応問題ないのですが、ReadFileのほうはデバイスが通信モードに入っていないときでもデバイスからの受信待ちを続けて処理がストップしてしまいます。 SetCommTimeoutsでタイムアウトの設定をできないかとやってみたのですが、「ファンクションが違います」というエラーがでるばかりでなんともなりません。 こいつはシリアル通信のときにしか使えないのでしょうか。 HIDデバイスとの通信でタイムアウトを設定する方法はないものでしょうか? あるいは受信待ちでストップしないよい方法はないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • haniriito
  • ベストアンサー率57% (12/21)
回答No.1

回答が遅くて、もう見てないかな・・・ HIDではやったことは無いのですが、非同期I/Oは使えませんかね? CreateFileするときにFILE_FLAG_OVERLAPPEDフラグを指定しておいて、 ReadFileのときにはOVERLAP構造体を与えます。 ReadFile自体はすぐにreturnしてきます(ERROR_IO_PENDINGが返される)ので、 OVERLAP構造体に指定したイベントの完了を待ってReadFileの完了を確認できます。 このとき、WaitForSingleObjectに有限のタイムアウト時間を指定すれば、 指定時間内に有効なデータ受信されなかったことが分かります。 この説明で分からなければ、どこが分からないかを再度質問して下さい。 上に書いた手順では、ReadFileからreturnしてきて(あるいはタイムアウトして)別の処理を行うことができますが、 そのReadFile自体はシステム内部でまだ継続しているはずです(PCからHIDに対してデータの読み込みトランザクションが継続している状態)。 これもキャンセルするには、更にCancelIOというAPIが使えそうです(が、試したわけではありません)。 あ、それとSetCommTimeoutsはご推察通りシリアル限定です。

fillet_o_fish
質問者

お礼

回答ありがとうございます。 やっぱり、ソレしかないのかー。 CancelIOは知らなかったので純粋に助かりました。 おかげで踏ん切りついたので、あらためてがんばります。 ほんとありがとう!

関連するQ&A

  • ReadFile処理時のCPU使用率について

    はじめまして。 C++Builderの6.0で開発をしているものですが、現在、シリアル通信のモジュールを作成していて、ReadFileを用いて受信側の処理を行っています。ですがステップ実行させてみるとReadFile処理時のCPU使用率が100%になってしまいます。一方、送信のWriteFileではCPU使用率は上がりません。この現象について解決策があれば教えてください。 よろしくお願いします。

  • Beckyでのタイムアウト表示

    Beckyでのタイムアウト表示 Windows Vistaで、メールソフトはBecky2を使っています。 便利性がよく気に入っているのですが、最近、3~4メガぐらいのものが届くと「通信中にエラーが起きました。タイムアウトした可能性があります。後でやり直してください」というメッセージが出るようになり、何回繰り返してもメッセージも変わらず、そのメールが受け取れないために後続のメールも受信不可能で大変困っています。 プロバイダーに問い合わせたところ、プロバイダーではその程度のものなら配信可能なんだそうです。 とりあえず、サーバーで削除(隔離)してもらって後続のメールをとりこんでいます。 今、私がやっていることは他のフリーメールソフトを介してそのメールが誰からのものとかを確認して受信しています。 タイムアウトの時間(秒数)も増やしてみましたが効果なし。何か設定に問題があるのでしょうか。 お分かりの方ぜひご教示願います。

  • ThunderBird でタイムアウトが起こる

    マイリカバリで、以前の状態に戻し メールソフトのバックアップを取って(フリーソフトにて)、リカバリー後読み込んだのですが、Gmailを受信できなくなりました。その時に「タイムアウトされましというメッセージが出て。ストップしてしまいます。 設定もバックアップし、その後色々と考えたのですが解りません。 メールのメッセージも消したりしたのですが、直りません。 ThunderBird 3.1.11です。 OS Windows Vista です。 回答よろしくお願いします。

  • out look メールの受信について

    アウトルックを立ち上げるとメールの送受信が始まるのですが、 それが一定数を受信してから「受信中」のままストップしてしまいます。 タイムアウト設定も反応しないで10分以上経ってからタイムアウトエラーが起こります。 そしてひたすら同じメールを受信しまくってます。 どうしたらよいでしょうか?

  • ReadFileについて

    はじめまして。 コマンドラインから実行可能なRS232C通信プログラムを Cで作成しています。 ハイパーターミナルからCOM2に文字を出力して ReadFileで取得した文字列を画面にはき出すというだけの 「Hello,World!」のような簡単なプログラムなのですが ReadFileの動作結果に思うようなものが得られず困っています。 お知恵をお貸しください。 読込結果がおかしいのです。 リターンキー以外は何を入力しても「7F」が返ってきてしまいます (リターンキー入力の場合も正常値ではありません)。 また、入力も無視されたり、認識されたりで動作も不安定です。 ReadFile自体のエラーは発生しません。 よろしくお願いいたします。 Borland C++ Compiler 5.5 Windows2000(実際に動作させたいのはWin95上です) 以下、コードです。 DWORD dwErrors; // エラー情報 COMSTAT ComStat; // デバイスの状態 DWORD dwCount; //受信データのバイト数 DWORD dwRead; // ポートから読み出したバイト数 unsigned char pszBuf[30];// 受信バッファ while(1){  ClearCommError(hComm, &dwErrors, &ComStat);  dwCount = ComStat.cbInQue;  if (0 >= dwCount) continue;  memset(pszBuf,'\0',sizeof(pszBuf));  if (ReadFile(hComm, pszBuf, dwCount, &dwRead, NULL)){   if (dwRead > 0) {    if (pszBuf[0] == '\r') break;    printf("%%s : %s\n",pszBuf);   }else{    break;   }  } }

  • avast!のタイムアウトについて

    他のHPや、ここで検索しても出てこなかったので質問させていただきます。 avast!というアンチウイルスソフトを使っているのですが、ときどきタイムアウトの表示が出てきます。 「待ち続けますか?」のメッセージで、「はい」「いいえ」のどちらにしても再びタイムアウトの表示が出てしまいます。タイムアウトまでの時間を延ばしても変わりません。(250→600にしました) どういう意味で通信をしているのかはハッキリわかりませんがたまたま手動更新したらDLしたので、自動更新の通信でしょうか? 他のソフトとの絡みも気になります。 SpywareGuard(常駐) SpywareBlaster Spybot ↑の3つのソフトとの関係が気になるので教えていただけると幸です。 特に上2つが英語なのでアップデートはしていますがそれ以外は全くわかりません。何か設定しなければいけないようなら、猿でもわかるように教えてください。 環境はADSLです。 もし今までに同じようなカキコミがあれば誘導もお願いします。 長文駄文すいません。よろしくお願いします。

  • URLConnectionを用いたHTTPS通信時のタイムアウト設定

    現在java1.4.2.10を用いて、 指定のIDに紐づいたURLをDBから取得し、URLConnectionを用いて、取得したURL接続するといったプログラムを作成しております。 今回困っておりますのが、取得したURLがHTTPS通信だった場合のタイムアウト設定方法となります。 HTTPの場合は、下記のサイト http://www.slayers.nu/~kumasaka/Gyoumu/timeout.html を参考にさせていただき、なんとかなりましたが、HTTPSの場合には対応しておらず、困っております。 java1.5にはタイムアウト設定があるのですが、都合上1.5にはできず、 1.4.2で対応したく考えております。 System.setProperty に sun.net.client.defaultReadTimeout を設定することで getInputStream から抜けるまでの時間を制御できるようなのですが、これだと、1接続ごとにタイムアウト設定できません。 socket通信も考えたのですが、socket通信を用いた場合の、HTTPS通信の仕方もわからず、どなたかご教授のほどよろしくお願いいたします。

  • OEのタイムアウトについて

    自分のPCではないので、詳細が書けず、申し訳ないのですが… WinXPでOutlook Expressを使っています。ウイルスソフトはキャノンのNOD32アンチウイルスです。 最近メールの受信ができなくなってしまいました。 途中までは受信できるのですが、毎回同じところで受信が止まってしまい、タイムアウトになってしまいます。 完全に受信できず中断してしまうので、同じメールが何通もたまってしまいます。 他の事務所のPCで一時的にそのメールアカウントを追加してみると、問題なく受信できます。 最近、セキュリティを強化するため、設定を変えたらしいのですが、その関係もあるのでしょうか? (カードを挿してパスワードを入れないとPCが立ち上がらなくしてあるようです)

  • メール受信ができずルール設定しましたが、受信中の状態のままタイムアウトしてしまいます。どなたか教えてください。

     某新聞配信を申し込んだところ、数日後からウィルス付と思われるメールが入り、幸いウィルスバスターが機能したのですが、添付ファイルをブロックしたというメールを10通近く受信しました。まだ20通近くサーバーに来ている様なのですが、何かが引っかかっているのか、メールの受信ができなくなりました。  受信のルールを「2MB以上ダウンロードしない」と設定すると、短いメール数通は受信でき、受信トレイに入ります。「3MB以上ダウンロードせず」に設定すると、7通受信中となったままタイムアウト(最大5分に設定)します。ルールを設定しないと20数通受信中のままタイムアウトです。  「添付ファイルをダウンロードしない」としても「アドレス帳に載せた人のみダウンロードする」としても、7通のままタイムアウトです。受信の必要なメールがあるのですが、どうしたらいいか、どなたか教えていただけませんか。ちなみに、通常のメールは何MB位なのですか?  よろしくお願いします。

  • GoogleChromeのタイムアウトエラー。

    windows8.1を使っています。 当初、GoogleChromeは何ら問題なく、ネットも軽くさくさくと動いておりました。 ところがしばらくして、起動してもタイムアウトエラーと出て、ネットに繋がりません。 IEもFirefoxも他のブラウザは動いているのでネットワークエラーとは考えられません。 先日、試しに「Windows8モードでChromeを再起動」してみたら、繋がりました。 Windows8モードにしないとネットに繋がらず、一旦8から起動して、デスクトップに戻して使うことになっています。 面倒なので使わなければいいのでしょうが、Firefoxは重いし、IEは勝手が悪くて使いたくありません。 そもそも、この状況がGoogleChromeのみでの不具合なのか、Windows8.1の問題なのかわからず、質問させていただきました。 これはなにか設定ミスがあったからなのでしょうか。 よろしくお願い致します。

専門家に質問してみよう