PCとUSB接続した際のCOMポート番号の固定化について (RX111)

お世話になっております。raomine2と申します。

 

RX111を搭載した自作基板を用意し、下記FITモジュールを使用してPCとUSB通信を行っています。

通信自体は問題なく、PCからはCOMポートのUSBシリアルデバイスとして認識されています。

 

ここでご質問させてください。

現在、同じ仕様の複数枚の基板に対し、同じソフトウェアを書き込んだ状態で、1枚ずつPCに接続した際に、認識されるCOMポート番号が基板ごとに変わってしまいます。

この認識されるCOMポート番号をソフトウェアから固定化する方法はありませんか。(同一の個体と認識させる)

また、複数基板のPCへの同時接続は考えておりません。

ご教示の程よろしくお願いいたします。

 

使用FITモジュール

・ボードサポートパッケージ (r_bsp) ver5.40

・USB Basic Mini Host and Peripheral Driver (r_usb_basic_mini) ver1.12

・USB Peripheral Communications Device Class Driver for USB Mini Firmware (r_usb_pcdc_mini) ver1.12

  • 試しにぐぐってみた

    https://www.google.com/search?q=%E4%BB%AE%E6%83%B3COM%E3%83%9D%E3%83%BC%E3%83%88+%E5%9B%BA%E5%AE%9A&ie=UTF-8

    ……結構参考になりそうなことも書いてあるみたいですが試されたものはありますでしょうか?

  • raomine2さん
    パソコンの環境によってCOMポート番号が違うのでPC側からCOMポート番号を指定して接続することができないので不便ですよね、一つの対応策ですが、PCのソフト作成時に最初からCOMポート番号を指定して接続するのではなく、最初に全てのCOMポート番号をオープンしてみます、オープン出来たものから順にバージョン番号とシリアル番号を読み取ります、自分の期待するバージョン番号とシリアル番号が取得できた時点で接続を維持します、このようにすれば、COMポート番号に影響されずに接続が可能になります。
  • こんにちは、のーしゃんです。

    私がよくやるDLL(VC++)では開発したデバイスIDを探して、そこにあるCOM名からOPENして使っています。
    Windowsアプリに適合するUSBデバイスを自動探してopenできるので便利です。

    ここからソース抜粋です。
    #include "SetupAPI.h"
    #include "Ntddser.h"
    #pragma comment(lib,"setupapi.lib")

    Open前の関数の一部です。
    BYTE buffer[1024];
    TCHAR port_name[256];
    DWORD length = 0;
    SP_DEVINFO_DATA DeviceInfoData = { sizeof(SP_DEVINFO_DATA) };

    // 指定されたクラスに所属するすべてのデバイスが含まれている1つのデバイス情報セットを返します。
    HDEVINFO hDevInfo = SetupDiGetClassDevs(&GUID_DEVINTERFACE_COMPORT, NULL, NULL, (DIGCF_PRESENT | DIGCF_ALLCLASSES));
    if (hDevInfo != INVALID_HANDLE_VALUE) {
    for (int i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); i++) {
    // ハードウェアIDを取得
    memset(buffer, 0, sizeof(buffer));
    SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_HARDWAREID, NULL, buffer, sizeof(buffer), &length);
    // ルネサスUSBモジュールか?デバイスマネージャーのデバイスIDで表示される文字列を検索
    if (wcsstr((TCHAR*)buffer, TEXT("USB\\VID_ここにベンダーID&PID_ここにデバイス番号")) != NULL) {
    // フレンドリネームを取得する
    memset(buffer, 0, sizeof(buffer));
    SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_FRIENDLYNAME, NULL, buffer, sizeof(buffer), &length);
    // COMを探す
    TCHAR* p1 = wcsstr((TCHAR*)buffer, TEXT("COM"));
    if (p1 != NULL) {
    wcscpy_s(port_name, TEXT("\\\\.\\"));
    TCHAR* p2 = wcsstr(p1, TEXT(")"));
    *p2 = 0; // '('を消す
    wcscat_s(port_name, p1);
    // ここで見つかったフラグをセットして、後述のopenで確認してopenする。最初にport_nameに空をセットしても良い。
    break;
    }
    }
    }
    }
    以降、port_nameでOpenする。

    以上。
  • raomine2さん、こんにちは。NoMaYと申します。

    fujita nozomuさんのアドバイスのGoogle検索の中にあったのですが、以下のページに書かれていたMicrochip社の話はRenesas社の話も同様な筈で、自作基板側のUSBのstring descriptorにてデバイスシリアル番号を設定してみてはどうでしょうか?(すみません、私自身でFITで試したことはないのですが、私のUSB一般の知識でも、そうすればよい筈、という記憶でしたので。) ただ、私の記憶では、デバイスシリアル番号は、いわゆる製造番号のようなもの、だったと思いますので、全ての基板でそれを同じにすることは、裏技のようなもの、になってしまいそうな感じでもありますけれど。

    電子工作 - もくしいWiki
    仮想COMポートデバイスで接続するポートを変更するたびにCOMポート番号が変わってしまう
     

  • iSerialNumberを固定値にしてしまえば良さそうですね。
    www.renesas.com/.../r01an1670ej0100_rx111.pdf

  • お世話になっております。raomine2と申します。
    お返事が遅くなってしまい申し訳ございません。

    fujita nozomuさん、NoMaYさん、Kirinさんのご教示の通り、
    RX111 ファームウェアのiSerialNumberを固定化することで、本件解決いたしました。

    ただ、NoMaYさんの仰るようにiSerialNumberをすべての基板で同じにしてしまうのは、あまり良い方法とは言えないと感じます。こちらに関しては、別途検討させていただきます。

    IKUZOさん、のーしゃんさん、ご教示ありがとうございます。
    PCソフトから接続をOPENする際にこれらを参考にさせていただきます。

    例えば、のーしゃんの仰るようにVIDとPIDからデバイスを検索するようにすれば、iSerialNumberを固定化せずとも、デバイスを指定して接続できるのではないかと考えています。

    以上です。
    皆様ありがとうございました。