纯C++自动识别设备串口

在这里插入图片描述

//#include <stdio.h>
//#include <stdlib.h>
//#include <vector>
//#include <locale.h>
#include <string>
#include <Windows.h>
#include <setupapi.h>
#pragma comment(lib, "setupapi.lib")
using namespace std;

//windows /dev/ttyGS1 ttyGS9----------------------------big MI
//#define MY_01	("VID_05C6&PID_9091&MI_06") 
//#define MY_02	("VID_05C6&PID_901D&MI_04") 
//#define MY_03	("VID_05C6&PID_90DF&MI_03") 
//#define MY_04	("VID_05C6&PID_90B5&MI_06") 
//#define MY_05	("VID_05C6&PID_90B6&MI_07") 
//#define MY_06	("VID_05C6&PID_90B8&MI_07") 
//#define MY_07	("VID_05C6&PID_F00E&MI_04") 
//#define MY_08	("VID_05C6&PID_9024&MI_05") 
//#define MY_09	("VID_18D1&PID_4EE8&MI_06") 
//#define MY_10	("VID_18D1&PID_4001&MI_02") 
//#define MY_11	("VID_1782&PID_5D31&MI_08") 
//#define MY_12	("VID_1782&PID_5D20&MI_04") 

//windows /dev/ttyGS0 ttyGS8----------------------------small MI
#define MY_01	("VID_05C6&PID_9091&MI_04") 
#define MY_02	("VID_05C6&PID_901D&MI_02")
#define MY_03	("VID_05C6&PID_90DF&MI_01")
#define MY_04	("VID_05C6&PID_90B5&MI_04") 
#define MY_05	("VID_05C6&PID_90B6&MI_05") 
#define MY_06	("VID_05C6&PID_90B8&MI_05") 
#define MY_07	("VID_05C6&PID_F00E&MI_02") 
#define MY_08	("VID_05C6&PID_9024&MI_03") 
#define MY_09	("VID_18D1&PID_4EE8&MI_04") 
#define MY_10	("VID_18D1&PID_4001&MI_00") 
#define MY_11	("VID_1782&PID_5D31&MI_06") 
#define MY_12	("VID_1782&PID_5D20&MI_02") 


#define MY_USB_PID_VID_F200	("VID_05C6&PID_9018") //old device
#define MY_USB_PID_VID_F210	("VID_18D1&PID_4001")

int extractNumberFromParentheses(const char* input) {
    const char* start = strchr(input, '(');
    const char* end = strchr(input, ')');
    if (start != NULL && end != NULL) {
        char number[10];
        strncpy(number, start + 1, end - start - 1);
        number[end - start - 1] = '\0';
        return atoi(number+3); //skip COM
    }
    return -1; // Return -1 if parentheses not found or number extraction fails
}
int getSpecialComNumFromDevInfo()
{
	//printf("Locale is: %s\n", setlocale(LC_ALL, "chs"));
	HDEVINFO hDevInfo = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_PRESENT | DIGCF_ALLCLASSES);
	if (hDevInfo == INVALID_HANDLE_VALUE)
	{
		printf("SetupDiGetClassDevs Err:%d", GetLastError());
		return -1;
	};

	SP_CLASSIMAGELIST_DATA _spImageData = { 0 };
	_spImageData.cbSize = sizeof(SP_CLASSIMAGELIST_DATA);
	SetupDiGetClassImageList(&_spImageData);

	SP_DEVINFO_DATA spDevInfoData = { 0 };
	spDevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
	for (DWORD i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &spDevInfoData); i++)
	{
	
		DWORD nSize = 0;
		CHAR szDis[MAX_PATH] = { 0x00 };
		if (!SetupDiGetDeviceInstanceIdA(hDevInfo, &spDevInfoData, szDis, sizeof(szDis), &nSize)) { break; }
			printf("PID_VID:%s\r\n", szDis);
		if (strstr(szDis, MY_USB_PID_VID_F200) == NULL
			&& strstr(szDis, MY_USB_PID_VID_F210) == NULL
			&& strstr(szDis, MY_01) ==NULL
			&& strstr(szDis, MY_02) ==NULL
			&& strstr(szDis, MY_03) ==NULL
			&& strstr(szDis, MY_04) ==NULL
			&& strstr(szDis, MY_05) ==NULL
			&& strstr(szDis, MY_06) ==NULL
			&& strstr(szDis, MY_07) ==NULL
			&& strstr(szDis, MY_08) ==NULL
			&& strstr(szDis, MY_09) ==NULL
			&& strstr(szDis, MY_10) ==NULL
			&& strstr(szDis, MY_11) ==NULL
			&& strstr(szDis, MY_12) ==NULL)
		
		{
			continue;
		}
		
		printf("PID_VID mathched.\r\n");		
		char  szName[MAX_PATH] = { 0 };
		if (SetupDiGetDeviceRegistryPropertyA(hDevInfo, &spDevInfoData, SPDRP_FRIENDLYNAME, NULL, (PBYTE)szName, MAX_PATH - 1, 0))
		{
			printf("FriendlyName:%s\r\n\r\n", szName);
			return extractNumberFromParentheses(szName);
		}
	}
	SetupDiDestroyClassImageList(&_spImageData);
	return -1;
}
void main()
{
	printf("COM%d\r\n",getSpecialComNumFromDevInfo());
	getchar();
}

相关推荐

  1. C++设置浮点数精度

    2024-04-27 23:00:02       38 阅读
  2. 自动化】在C#中创建和配置串口对象SerialPort

    2024-04-27 23:00:02       39 阅读
  3. c++ 虚函数

    2024-04-27 23:00:02       38 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-27 23:00:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-27 23:00:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-27 23:00:02       87 阅读
  4. Python语言-面向对象

    2024-04-27 23:00:02       96 阅读

热门阅读

  1. 如何用代码制作一个想要的网站?

    2024-04-27 23:00:02       37 阅读
  2. 状态模式:管理状态转换的策略

    2024-04-27 23:00:02       39 阅读
  3. 请求头headers中的信息

    2024-04-27 23:00:02       35 阅读
  4. SpringBoot的核心内容之自动装配

    2024-04-27 23:00:02       34 阅读
  5. C# 学习笔记

    2024-04-27 23:00:02       32 阅读
  6. C# Solidworks二次开发:枚举应用实战(第六讲)

    2024-04-27 23:00:02       30 阅读
  7. centOS7.9| 无root安装 openssl 1.1.1

    2024-04-27 23:00:02       30 阅读
  8. Python中的进制转换函数详解

    2024-04-27 23:00:02       37 阅读
  9. ReactNative0.74 版本发布重大更新

    2024-04-27 23:00:02       172 阅读
  10. Chapter 1-16. Introduction to Congestion in Storage Networks

    2024-04-27 23:00:02       36 阅读