近頃のUSBマイコンは、CDCクラスファームウェアのサンプルを提供しているものも多い。WindowsにはCDCクラスドライバ usbser.sys があるので、CDCクラスデバイスにすれば、INFファイルを用意するだけで(それもサンプルがあるのでVID/PIDやストリングを書き換える程度で)Windows用の仮想COMポートになるUSBデバイスをすぐ作れる。
(Mac OS Xでは、CDCクラスデバイスは、.INFのようなものも要らず、ただ接続するだけで使える状態になるらしい。Linuxは…調べてない)
でも、Windowsのusbser.sysのプラグアンドプレイ対応は不完全?
1. あるプロセスが、USB仮想COMポートをオープンしたままの状態の時に
2. そのUSB仮想COMポートデバイスを、引っこ抜く
3. また挿す
4. (このときは QueryDosDeviceA で COM?? を探すと見つかる)
5. 1.のプロセスが CloseHandle() する
6. 1.のプロセスや他のプロセスは また USB仮想COMポートデバイスをオープンできるようになってしかるべきだと思うが、できない。
7. (このときは QueryDosDeviceA で COM?? を探しても、見つからない)(しかし、デバイスマネージャで見ると存在している)
8. デバイスを再度、挿抜すると、正常になる。
困ったなー。ググると、こういうこととかがイヤだから、マトモなUSB-Serial変換はusbser.sysを使わず独自にドライバを用意してる…という話もあるみたい(もちろん通信応答性の改善のためとかの理由もあるだろうけど)。
コメント