CDC通信途中で切断した後、再接続出来ない

解決


junjun  2012-06-08 13:00:01  No: 73426  IP: 192.*.*.*

いつもお世話になっています。

現在CDC通信(USB⇔シリアル変換)させて、データ通信をするソフトを作成しているのですが、、、、、
データ通信途中で切断すると、再接続がうまく出来なくて困っています。

■手順
  ①USBを接続する
  ②CreateFile  でCOMポートをOpenする
  ③WriteFileでデータの通信をする
  ④データ転送途中でUSBを抜く    ・・・デバマネで消えるのを確認
  ⑤USBを挿す                    ・・・デバマネで接続を確認
  ⑥CloseHandleをする
  ⑦CreateFile  でCOMポートをOpenする    ←  ここで失敗する!

⑦でのCreateFileで失敗した時のGetLastErrorの返り値は
  0x00000002    指定されたファイルが見つかりません。

となっています。
この状態で、再度USBを抜く→挿すをすると、CreateFileが成功するように
なります。


これってWindowsの仕様とかなんでしょうか??
なんとかUSBを抜かずに対応ができるとBestなんですが、、、、、

よいアドバイスがあれば教えていただきたいです。

協力宜しくお願いします。。。

編集 削除
オショウ  2012-06-08 17:49:15  No: 73427  IP: 192.*.*.*

それは無茶苦茶です。

デバイスの変化を監視して、USBを抜いた際、即COMポートを
CloseFileそて解放しないと、再接続時に正常に動作しません。

行儀の悪いメーカーのUSB・シリアル変換の場合、OSクラッ
シュしたりする場合もありますので、そう簡単にはいきません。

頑張って下さい。

以上。

編集 削除
junjun  2012-06-10 00:37:27  No: 73428  IP: 192.*.*.*

回答ありがとうございます。
ということは、⑤と⑥を入れ替えた手順であればよいということでしょうか?

  ①USBを接続する
  ②CreateFile  でCOMポートをOpenする
  ③WriteFileでデータの通信をする
  ④データ転送途中でUSBを抜く    ・・・デバマネで消えるのを確認
  ⑤CloseHandleをする
  ⑥USBを挿す                    ・・・デバマネで接続を確認
  ⑦CreateFile  でCOMポートをOpenする    ←  ここで失敗する!

ちょっと確認してみます。
今日は確認することができないので来週になってしまいますが、、、

そもそもの用途:::※最初に抜けていました><
USB⇔シリアル変換の回路が、機器に組み込まれており、機器にリブート
コマンドを発行すると再起動するのですが、起動後そのまま
接続されるため、Windowsから見ると、切断→接続が行われます。
現状リブートコマンドができていないので、テスト的にUSB抜き挿しにて
デバッグしていました。

WM_DEVICECHANGEは受け取れるので、やってみます。
問題は、機器の再接続までの時間くらいですね。
その前にCloseHandleを実行できればいいのかな?

編集 削除
オショウ  2012-06-10 01:50:41  No: 73429  IP: 192.*.*.*

WM_DEVICECHANGEで、接続のタイミングと切断のタイミングを
逃さなければ、大丈夫かと考えます。

ただし、接続時WM_DEVICECHANGEが来ても、COMポートの方
はまだドライバーがロードされていない場合もありますので
一定時間まってからCreateFileするか、何度かリトライして
オープンに成功するまで繰り返すような動作が必要かと考え
ます。

以上。

編集 削除
junjun  2012-06-15 16:18:58  No: 73430  IP: 192.*.*.*

返事が遅くなりました。

WM_DEVICECHANGEを受け取って解放することで解決しました!!
接続の部分に関しても、検討したいと思います。

協力ありがとうございます。

編集 削除