diff --git a/ECTrainer2/BitalMonitor.cpp b/ECTrainer2/BitalMonitor.cpp index 071ce24..5daedb6 100644 --- a/ECTrainer2/BitalMonitor.cpp +++ b/ECTrainer2/BitalMonitor.cpp @@ -14,19 +14,12 @@ _rrInterval.Put(0); } + // 初期化 bool BitalMonitor::Init() { - - // デバイスの探索 - for (int com = 1; com <= COM_SEARCH_MAX; com++) { - - if (!_Com.Open(com, _T("baud=19200 parity=N data=8 stop=1"))) continue; - - // ポートチェック - char comBuf[BUF_LEN] = { '\0' }; - DWORD readBytes = _Com.Receive((BYTE*)comBuf, BUF_LEN - 1); - if (readBytes < 1) continue; - if ((*comBuf >= '0' && *comBuf <= '9') || *comBuf == '#' || *comBuf == LF) { + int com = nkc::ComPort::FindDevice(_T("CP210x")); + if (com > 0) { + if (_Com.Open(com, _T("baud=19200 parity=N data=8 stop=1"))) { Ect()->PWorker()->EventLog(_T("Bital device connected.")); _useDevice = true; return true; diff --git a/ECTrainer2/BitalMonitor.h b/ECTrainer2/BitalMonitor.h index 01d662e..44e61b6 100644 --- a/ECTrainer2/BitalMonitor.h +++ b/ECTrainer2/BitalMonitor.h @@ -23,7 +23,6 @@ // ECTrainerインスタンス取得 ECTrainer* Ect() { return (ECTrainer*)_pUserdata; } - public: BitalMonitor(ECTrainer* pEct); bool Init(); diff --git a/ECTrainer2/ComPort.cpp b/ECTrainer2/ComPort.cpp index 1e03c20..de10187 100644 --- a/ECTrainer2/ComPort.cpp +++ b/ECTrainer2/ComPort.cpp @@ -1,4 +1,8 @@ #include "ComPort.h" +#include +#include +#pragma comment(lib,"setupapi.lib") +typedef std::basic_string tstring; namespace nkc { @@ -129,4 +133,40 @@ return receiveSize; } + +// COMポートデバイスを検索する +// 引数 TCHAR* deviceStr : 検索するデバイス名(部分一致) +// 戻り値 (int)COMポート番号,未発見時は 0 +int ComPort::FindDevice(const TCHAR* deviceStr) { + + HDEVINFO hDevInfo = SetupDiGetClassDevs(&GUID_DEVINTERFACE_COMPORT, 0, 0, + DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); // デバイス情報セットを取得 + if (!hDevInfo) return 0; // デバイス情報セットが取得できなかった場合 + + SP_DEVINFO_DATA devInfoData; + ZeroMemory(&devInfoData, sizeof(devInfoData)); + devInfoData.cbSize = sizeof(devInfoData); + + // COMポート列挙 + int nDevice = 0; + int com = 0; + while (SetupDiEnumDeviceInfo(hDevInfo, nDevice++, &devInfoData) && com < 1) { + BYTE friendly_name[300]; + SetupDiGetDeviceRegistryProperty(hDevInfo, &devInfoData, + SPDRP_FRIENDLYNAME, NULL, friendly_name, sizeof(friendly_name), NULL); + auto fn = tstring((TCHAR*)friendly_name); + + // デバイス検索 + if (fn.find(deviceStr) != tstring::npos) { + size_t start = fn.find(_T("(COM")) + 4; + com = _tstoi(fn.substr(start).c_str()); + //_tprintf(_T("Found : %s\n"), fn.c_str()); + } + } + SetupDiDestroyDeviceInfoList(hDevInfo); // デバイス情報セットを解放 + + return com; +} + + }; // namespace nkc diff --git a/ECTrainer2/ComPort.h b/ECTrainer2/ComPort.h index 673e18f..e19dec5 100644 --- a/ECTrainer2/ComPort.h +++ b/ECTrainer2/ComPort.h @@ -13,7 +13,6 @@ HANDLE _ComHandle; public: - ComPort(void); ~ComPort(void); int Open(TCHAR* config, char* sendStr, int sendLen, char* checkStr, int checkLen); @@ -22,6 +21,7 @@ DWORD Send(const BYTE* data, DWORD dataLen); DWORD Receive(BYTE* buffer, DWORD bufferLen); DWORD WaitReceive(BYTE* buffer, DWORD bufferLen, int timeout); + static int FindDevice(const TCHAR* deviceStr); // COMポート一覧取得 }; }; // namespace nkc