USBデバイスのCDCクラス・デバイスをWindows PCの違うUSBポートに接続するとCOMポートが新たに作成されてしまい、COMポート番号の数がすぐに2桁になってしまいます。これを防ぐにはどうしたらよいでしょうか?

 

その答えが、マイクロチップ社の Q&Aにありました。

対処法は、USBデバイスに シリアル番号 を振ることです。

 

以下に、その手順内容を一部編集して、転記します。

変更箇所は、4箇所あります。

  • usb_descriptors.c に、3箇所
    1. Device Descriptor の変更
    2. Serial number string descriptor の新設
    3. string descriptorアドレス配列 の追記
  • usb_config.h に、1箇所
    1. USB_NUM_STRING_DESCRIPTORS定義の変更
なお、この方法はMLA (Microchip Libraries for Applications)を利用してプロジェクトを作成した場合に適用します。
もし、MCC (MPLAB® Code Configurator) を利用してCDCクラス・デバイスをプログラムしている場合は、すごく簡単です。この記事の最後に紹介します。

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) を利用している場合

PICプログラムプロジェクトをMCCでデバイスリソースの USB下、MLA USB Device Lite をダブルクリックして、組み込んでいる場合は、簡単にシリアル番号を振ることができます。
Device setting蘭の最下部にある「Serial Number String」欄に設定するシリアル番号の文字を記入します。usb_descriptors.c や usb_config.h の内容変更は、MCCが自動で実施します。
MCCでの MLA USB Device Lite の詳細な設定例は、USB - CDC basic MCC に示してあるので、そちらをご覧ください。