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文件存在命名空间冲突.自己手动修改下即可
800

被折叠的 条评论
为什么被折叠?



