赞
踩
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.csdn.net/tody_guo/article/details/8675237
1. C++Builder XE 10.2 包含有 windows SDK. 操作SetupDI时不需要安装DDK
2. C++Builder XE 10.2 项目工程使用char* 另外有部分SDK文件存在命名空间冲突.自己手动修改下即可
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。