USBデバイスのCDCクラス・デバイスをWindows PCの違うUSBポートに接続するとCOMポートが新たに作成されてしまい、COMポート番号の数がすぐに2桁になってしまいます。これを防ぐにはどうしたらよいでしょうか?
その答えが、マイクロチップ社の Q&Aにありました。
対処法は、USBデバイスに シリアル番号 を振ることです。
以下に、その手順内容を一部編集して、転記します。
変更箇所は、4箇所あります。
- usb_descriptors.c に、3箇所
- Device Descriptor の変更
- Serial number string descriptor の新設
- string descriptorアドレス配列 の追記
- usb_config.h に、1箇所
- USB_NUM_STRING_DESCRIPTORS定義の変更
usb_descriptors.c の変更
Device Descriptor の変更
usb_descriptors.c 内の”Device Descriptor”セクションを見つけます。
ファイルの166行目にありました。ただし、使用する環境によりファイル内の位置は大きく変化することがありますので、あくまでも行数は参考です。
その後、serial number stringのindex値を
0x00 から 0x03 に変更します。
/* Device Descriptor */
const USB_DEVICE_DESCRIPTOR device_dsc=
{
0x12, // Size of this descriptor in bytes
USB_DESCRIPTOR_DEVICE, // DEVICE descriptor type
0x0200, // USB Spec Release Number in BCD format
CDC_DEVICE, // Class Code
0x00, // Subclass code
0x00, // Protocol code
USB_EP0_BUFF_SIZE, // Max packet size for EP0, see usb_config.h
0x04D8, // Vendor ID
0x000A, // Product ID: CDC RS-232 Emulation Demo
0x0100, // Device release number in BCD format
0x01, // Manufacturer string index
0x02, // Product string index
0x03, // Device serial number string index
0x01 // Number of possible configurations
};
Serial number string descriptor の新設
usb_descriptors.c内のProduct string descriptorを探します。
ファイルの274行目にありました。そこに、Serial number string descriptorに関する親切な注釈が書かれています。ただし、使用する環境によりファイル内の位置や注釈の有無は大きく変化することがありますので、あくまでも行数は参考です。
その直下に、次の serial string descriptorを追加します。
例は、S/Nに「1234」を設定する場合です。他の文字列にする場合は、文字自体を変更するのとともに、文字数が4文字以外なら string[4];の数値も変更してください。
//Serial number string descriptor const struct{uint8_t bLength;uint8_t bDscType;uint16_t string[4];}sd003={ sizeof(sd003),USB_DESCRIPTOR_STRING, {'1','2','3','4'} };
string descriptorアドレス配列 の追記
usb_descriptors.c内のstring descriptorアドレス配列を見つけます。
ファイルの295行目にありました。ただし、使用する環境によりファイル内の位置は大きく変化することがありますので、あくまでも行数は参考です。
&sd002の後にコンマ “,”を追加し、続いて (const uint8_t *const)&sd003 を追加します。
//Array of string descriptors const uint8_t *const USB_SD_Ptr[USB_NUM_STRING_DESCRIPTORS]= { (const uint8_t *const)&sd000, (const uint8_t *const)&sd001, (const uint8_t *const)&sd002, (const uint8_t *const)&sd003
usb_config.h の変更
USB_NUM_STRING_DESCRIPTORS定義の変更
usb_config.h内のUSB_NUM_STRING_DESCRIPTORS定義を見つけます。
ファイルの140行目にありました。ただし、使用する環境によりファイル内の位置は大きく変化することがありますので、あくまでも行数は参考です。
そして、その値を4へ変更します。
#define USB_NUM_STRING_DESCRIPTORS 4
上記変更を保存し、ビルドします。
Serial Number String Descriptorは同じVID/PIDを持った複数のデバイスを区別するのに使います。
MCC (MPLAB® Code Configurator) を利用している場合