{{category 電子工作}} !!!現象 *USB-CDC (仮想COMポート) デバイスを制作したが、接続するポートを変更するたび COM ポート番号が変わって(増えて)しまって困る !!!原因 *デバイスシリアル番号が設定されていない。 !!!確認方法 *デバイスマネージャで該当デバイスの仮想 COM ポートのプロパティを見たときに以下のように CM_DEVCAP_UNIQUEID が「機能」項目にない。 {{ref_image UNIQUEID.gif}} !!!対策 *ファームウェア側でデバイスシリアル番号を設定するとよい。 Microchip 社製の USB Device - CDC - Basic Demo - C18 - Low Pin Count USB Development Kit 用サンプルコードでの変更箇所の例 usb_config.h #define USB_NUM_STRING_DESCRIPTORS 4 // もとは 3 usb_descriptors.c /* Device Descriptor */ ROM USB_DEVICE_DESCRIPTOR device_dsc= { (中略) 0x01, // Manufacturer string index 0x02, // Product string index 0x03, // Device serial number string index (0x00)=> 下で定義する 0x03 に変更 0x01 // Number of possible configurations }; (中略) // シリアル番号文字列の定義(このブロックをまるまる増やす) ROM struct{BYTE bLength;BYTE bDscType;WORD   string[25];}sd003={ sizeof(sd003),USB_DESCRIPTOR_STRING {'0','0','0','0','0','0','0','0','0','0', '0','0','0','0','0','0','0','0','0','0', '0','0','0','0',' 0'} }; (中略) //Array of string descriptors ROM BYTE *ROM USB_SD_Ptr[USB_NUM_STRING_DESCRIPTORS]= { (ROM BYTE *ROM)&sd000, (ROM BYTE *ROM)&sd001, (ROM BYTE *ROM)&sd002, (ROM BYTE *ROM)&sd003, // この行(シリアル番号)を追加 }; !!!注意事項 *上記の変更は説明のための一例です。間違っても実験以外でそのまま使わないこと! *Windows7 (x86) の Microsoft 標準のドライバを使用する CDC デバイスの場合、同じシリアル番号を持つデバイスをわざと作成して複数同時に接続してやると、後から接続したほうは新たな未使用 COM 番号を取得して動作する。この場合には、デバイスマネージャの上記ダイアログを観察すると、あとから接続されたデバイスのプロパティ>「機能」に "CM_DEVCAP_UNIQUEID" がないのが確認できた。 *挿入した2つの同一シリアル番号を持つデバイスをいったん両方取り外したのち、上記で後から接続した(新たな COM ポート番号で動作した)同一シリアル番号をもつデバイスを1つだけ再度接続すると、"CM_DEVCAP_UNIQUEID" は正常に復活し、割り当てられる COM ポート番号も当初挿入されていた番号に戻るようである。