いつもお世話になっています。
現在CDC通信(USB⇔シリアル変換)させて、データ通信をするソフトを作成しているのですが、、、、、
データ通信途中で切断すると、再接続がうまく出来なくて困っています。
■手順
①USBを接続する
②CreateFile でCOMポートをOpenする
③WriteFileでデータの通信をする
④データ転送途中でUSBを抜く ・・・デバマネで消えるのを確認
⑤USBを挿す ・・・デバマネで接続を確認
⑥CloseHandleをする
⑦CreateFile でCOMポートをOpenする ← ここで失敗する!
⑦でのCreateFileで失敗した時のGetLastErrorの返り値は
0x00000002 指定されたファイルが見つかりません。
となっています。
この状態で、再度USBを抜く→挿すをすると、CreateFileが成功するように
なります。
これってWindowsの仕様とかなんでしょうか??
なんとかUSBを抜かずに対応ができるとBestなんですが、、、、、
よいアドバイスがあれば教えていただきたいです。
協力宜しくお願いします。。。
それは無茶苦茶です。
デバイスの変化を監視して、USBを抜いた際、即COMポートを
CloseFileそて解放しないと、再接続時に正常に動作しません。
行儀の悪いメーカーのUSB・シリアル変換の場合、OSクラッ
シュしたりする場合もありますので、そう簡単にはいきません。
頑張って下さい。
以上。
回答ありがとうございます。
ということは、⑤と⑥を入れ替えた手順であればよいということでしょうか?
①USBを接続する
②CreateFile でCOMポートをOpenする
③WriteFileでデータの通信をする
④データ転送途中でUSBを抜く ・・・デバマネで消えるのを確認
⑤CloseHandleをする
⑥USBを挿す ・・・デバマネで接続を確認
⑦CreateFile でCOMポートをOpenする ← ここで失敗する!
ちょっと確認してみます。
今日は確認することができないので来週になってしまいますが、、、
そもそもの用途:::※最初に抜けていました><
USB⇔シリアル変換の回路が、機器に組み込まれており、機器にリブート
コマンドを発行すると再起動するのですが、起動後そのまま
接続されるため、Windowsから見ると、切断→接続が行われます。
現状リブートコマンドができていないので、テスト的にUSB抜き挿しにて
デバッグしていました。
WM_DEVICECHANGEは受け取れるので、やってみます。
問題は、機器の再接続までの時間くらいですね。
その前にCloseHandleを実行できればいいのかな?
WM_DEVICECHANGEで、接続のタイミングと切断のタイミングを
逃さなければ、大丈夫かと考えます。
ただし、接続時WM_DEVICECHANGEが来ても、COMポートの方
はまだドライバーがロードされていない場合もありますので
一定時間まってからCreateFileするか、何度かリトライして
オープンに成功するまで繰り返すような動作が必要かと考え
ます。
以上。
返事が遅くなりました。
WM_DEVICECHANGEを受け取って解放することで解決しました!!
接続の部分に関しても、検討したいと思います。
協力ありがとうございます。
ツイート | ![]() |