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

Parents
  • こんにちは、のーしゃんです。

    私がよくやる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する。

    以上。
Reply
  • こんにちは、のーしゃんです。

    私がよくやる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する。

    以上。
Children
No Data