Windows でのシリアルデバイスの確認

Windows 環境での、URG ポートの確認方法について解説します。



URG デバイスの認識

URG を Windows で使うためには、専用のドライバが必要です。
ドライバをインストールすると、URG は、USB 接続、シリアル接続の両方で COM として認識されます。何番の COM に割り当てられたかの確認は「デバイスマネージャ」から行います。

device_manager.png
デバイスマネージャからポート情報を確認



URG ドライバを利用している COM ポートの判定

Windows が認識している COM ポートは、レジストリで管理されています。よって、URG 用のドライバが使われている COM ポートには、URG が接続されているといえます。

指定したドライバ名を、Windows が利用しているか調べるプログラムを以下に示します。(動作確認は Windows XP のみ)

#include "isUsingComDriver.h"
#include "DetectOS.h"
#ifdef WINDOWS_OS
#include <windows.h>
#include <string>
#endif

using namespace std;


#ifdef WINDOWS_OS
namespace
{
    bool existRegValue(HKEY hkey, LPCSTR subkey, const char* find_value)
    {
        HKEY next_hkey;
        if (RegOpenKeyExA(hkey, subkey,
                          0, KEY_READ, &next_hkey) != ERROR_SUCCESS) {
            return false;
        }
        enum { MaxLength = 1024 };

        // find_value が存在するかを探索
        CHAR device[MaxLength + 1];
        char name[MaxLength + 1];

        DWORD ret = ERROR_SUCCESS;
        for (int i = 0; ret == ERROR_SUCCESS; ++i) {
            DWORD dl = MaxLength;
            DWORD nl = MaxLength;
            ret = RegEnumValueA(hkey, i, device, &dl,
                                NULL, NULL, (BYTE*)name, &nl);
            if (ret != ERROR_SUCCESS) {
                break;
            }
            if (! strncmp(name, find_value, nl)) {
                RegCloseKey(next_hkey);
                return true;
            }
        }

        // find_value が存在しなければ、再帰探索を行う
        char next_subkey[MaxLength];
        FILETIME filetime;

        ret = ERROR_SUCCESS;
        for (int i = 0; ret == ERROR_SUCCESS; ++i) {
            DWORD dl = MaxLength, nl = MaxLength;
            ret = RegEnumKeyExA(next_hkey, i, next_subkey,
                                &dl, NULL, NULL, &nl, &filetime);
            if (ret != ERROR_SUCCESS) {
                break;
            }

            bool value_exist =
                existRegValue(next_hkey, next_subkey, find_value);
            if (value_exist) {
                RegCloseKey(next_hkey);
                return true;
            }
        }

        RegCloseKey(next_hkey);
        return false;
    }
}


bool qrk::isUsingComDriver(const char* com_port, const char* driver_name)
{
    // 指定した名前と一致するかを確認する
    // !!!

    // 指定ドライバ名が が Value に含まれているか検索
    string value_pattern = string(driver_name) + " (" + com_port + ")";
    if (existRegValue(HKEY_LOCAL_MACHINE,
                      "SYSTEM\\CurrentControlSet\\Enum\\USB",
                      value_pattern.c_str())) {
        return true;
    }
    return false;
}
#else


bool qrk::isUsingComDriver(const char* com_port, const char* driver_name)
{
    static_cast<void>(com_port);
    static_cast<void>(driver_name);

    return false;
}
#endif


COM ポートの検出サンプル

FindComPorts.cppUrgUsbCom.cpp を用いて、Windows XP で利用可能な COM 一覧を取得するサンプルです。

 All Classes Namespaces Files Functions Variables Enumerations Enumerator