USB CDC COM获取设备信息方法(SetupDI)(C++Builder XE10.2)

      Android USB CDC COM端口. 如果Android设备不具备唯一ID.那么windows系统COM端口不是固定的.也就说说相同设备ID的Android设备挂载到PC端的时候.COM端口不固定. 这个情况想想通过简单的指定COM端口.来做COM端口操作就没办法.

       可以通过COM设备的LocalInformation位置确定唯一设备挂载地点. 动态的生成COM端口设备,从而动态锁定COM端口号

GUID  gui_cdc = {0x4D36E978L,0xE325,0x11CE,{0xBF,0xC1,0x08,0x00,0x2B,0xE1,0x03,0x18}};
#define INTERFACE_DETAIL_SIZE    (1024)

int  usb_cdc_get_com_port(AnsiString strDescFit,AnsiString strLocalInfo)
{
	//Dynamik Kernel COM
	AnsiString strDesc;
	AnsiString strTmp;
	int iPos,iStart,iCount;
    int com_port=0;

	CHAR   szBuf[MAX_PATH];
	SP_DEVINFO_DATA  spDevInfoData = {sizeof(SP_DEVINFO_DATA)};
	SP_DEVICE_INTERFACE_DATA  DeviceInterfaceData;
	DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);

	for(int i=0;i<CDC_MAX;i++)
	{
		m_cdcComPort[i]=0;
        m_cdcLocationInformation[i]="";
    }
	if(strDescFit.IsEmpty())  return com_port;

	//GUID获取设备信息
	HDEVINFO hDevInfo = SetupDiGetClassDevs((LPGUID)&gui_cdc,NULL,0,DIGCF_PRESENT); // | DIGCF_ALLCLASSES
    if (hDevInfo == INVALID_HANDLE_VALUE)
	{
		SetupDiDestroyDeviceInfoList(hDevInfo);
		return com_port;
	}

    //枚举设备
	for (DWORD i=0;SetupDiEnumDeviceInfo(hDevInfo,i,&spDevInfoData); i++)
	{
		if(i>=CDC_MAX) return com_port;

		//得到设备描述
		SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &spDevInfoData.ClassGuid, i, &DeviceInterfaceData);

		SetupDiGetDeviceRegistryProperty(hDevInfo,
											&spDevInfoData,
											SPDRP_DEVICEDESC,
											NULL,
											(PBYTE)szBuf,
											MAX_PATH,
											NULL);

		strDesc=szBuf;
		if(strDesc.Pos(strDescFit)>0)
		{
			//获取位置信息
            SetupDiGetDeviceRegistryProperty(hDevInfo,
											&spDevInfoData,
											SPDRP_LOCATION_INFORMATION,
											NULL,
											(PBYTE)szBuf,
											MAX_PATH,
											NULL);
			strTmp=szBuf;

			if(strLocalInfo==strTmp)
			{

				//获取COM端口
            	SetupDiGetDeviceRegistryProperty(hDevInfo,
												&spDevInfoData,
												SPDRP_FRIENDLYNAME,
												NULL,
											    (PBYTE)szBuf,
												MAX_PATH,
												NULL);
		
				strDesc=szBuf;
				iPos=strDesc.Pos("(COM");
				if(iPos>0)
				{
					iStart=iPos+4;
					iCount=strDesc.Length()-iStart+1;
					strTmp=strDesc.SubString(iStart,iCount);
					//46)
					iPos=strTmp.Pos(")");
					if(iPos>0)
					{
						strTmp=strTmp.SubString(1,iPos-1);
						try
						{
							com_port=strTmp.ToInt();
						}
						catch(...)
						{
							com_port=0;
						}
					}
				}
            }
		}
	}

    return com_port;
}

参考文章https://blog.youkuaiyun.com/tody_guo/article/details/8675237

1. C++Builder XE 10.2  包含有 windows SDK. 操作SetupDI时不需要安装DDK

2. C++Builder XE 10.2  项目工程使用char* 另外有部分SDK文件存在命名空间冲突.自己手动修改下即可

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值