当前位置:   article > 正文

USB CDC COM获取设备信息方法(SetupDI)(C++Builder XE10.2)_获取usb cdc硬件id

获取usb cdc硬件id

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

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

  1. GUID gui_cdc = {0x4D36E978L,0xE325,0x11CE,{0xBF,0xC1,0x08,0x00,0x2B,0xE1,0x03,0x18}};
  2. #define INTERFACE_DETAIL_SIZE (1024)
  3. int usb_cdc_get_com_port(AnsiString strDescFit,AnsiString strLocalInfo)
  4. {
  5. //Dynamik Kernel COM
  6. AnsiString strDesc;
  7. AnsiString strTmp;
  8. int iPos,iStart,iCount;
  9. int com_port=0;
  10. CHAR szBuf[MAX_PATH];
  11. SP_DEVINFO_DATA spDevInfoData = {sizeof(SP_DEVINFO_DATA)};
  12. SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
  13. DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
  14. for(int i=0;i<CDC_MAX;i++)
  15. {
  16. m_cdcComPort[i]=0;
  17. m_cdcLocationInformation[i]="";
  18. }
  19. if(strDescFit.IsEmpty()) return com_port;
  20. //GUID获取设备信息
  21. HDEVINFO hDevInfo = SetupDiGetClassDevs((LPGUID)&gui_cdc,NULL,0,DIGCF_PRESENT); // | DIGCF_ALLCLASSES
  22. if (hDevInfo == INVALID_HANDLE_VALUE)
  23. {
  24. SetupDiDestroyDeviceInfoList(hDevInfo);
  25. return com_port;
  26. }
  27. //枚举设备
  28. for (DWORD i=0;SetupDiEnumDeviceInfo(hDevInfo,i,&spDevInfoData); i++)
  29. {
  30. if(i>=CDC_MAX) return com_port;
  31. //得到设备描述
  32. SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &spDevInfoData.ClassGuid, i, &DeviceInterfaceData);
  33. SetupDiGetDeviceRegistryProperty(hDevInfo,
  34. &spDevInfoData,
  35. SPDRP_DEVICEDESC,
  36. NULL,
  37. (PBYTE)szBuf,
  38. MAX_PATH,
  39. NULL);
  40. strDesc=szBuf;
  41. if(strDesc.Pos(strDescFit)>0)
  42. {
  43. //获取位置信息
  44. SetupDiGetDeviceRegistryProperty(hDevInfo,
  45. &spDevInfoData,
  46. SPDRP_LOCATION_INFORMATION,
  47. NULL,
  48. (PBYTE)szBuf,
  49. MAX_PATH,
  50. NULL);
  51. strTmp=szBuf;
  52. if(strLocalInfo==strTmp)
  53. {
  54. //获取COM端口
  55. SetupDiGetDeviceRegistryProperty(hDevInfo,
  56. &spDevInfoData,
  57. SPDRP_FRIENDLYNAME,
  58. NULL,
  59. (PBYTE)szBuf,
  60. MAX_PATH,
  61. NULL);
  62. strDesc=szBuf;
  63. iPos=strDesc.Pos("(COM");
  64. if(iPos>0)
  65. {
  66. iStart=iPos+4;
  67. iCount=strDesc.Length()-iStart+1;
  68. strTmp=strDesc.SubString(iStart,iCount);
  69. //46)
  70. iPos=strTmp.Pos(")");
  71. if(iPos>0)
  72. {
  73. strTmp=strTmp.SubString(1,iPos-1);
  74. try
  75. {
  76. com_port=strTmp.ToInt();
  77. }
  78. catch(...)
  79. {
  80. com_port=0;
  81. }
  82. }
  83. }
  84. }
  85. }
  86. }
  87. return com_port;
  88. }

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/317188?site
推荐阅读
相关标签
  

闽ICP备14008679号