[开发工具] 请帮忙测试一下这个支持USB虚拟串口热插拔的串口调试助手

[复制链接]
 楼主| mohanwei 发表于 2015-7-9 12:20 | 显示全部楼层
i6950 发表于 2015-7-9 11:26
我用的是com0com
你自己装个com0com更容易调试

刚装了个com0com,装完默认它默认就添加了一对串口:COM6和COM7……测试了一下用这个串口测试工具可以识别
又添加了一对串口:COM8和COM9,加上一根USB转串口线就是5个串口,用这个串口测试工具都可以识别:
COM0COM.jpg

至于64位win7,不知道有什么不一样,暂时就不管了:lol
 楼主| mohanwei 发表于 2015-7-9 12:22 | 显示全部楼层
i6950 发表于 2015-7-9 11:35
ReadFile不是要传buffer的长度进去吗? 难道你没用上?

有啊,只是又封装了一道,看起来简洁点
i6950 发表于 2015-7-9 12:48 | 显示全部楼层
mohanwei 发表于 2015-7-9 12:20
刚装了个com0com,装完默认它默认就添加了一对串口:COM6和COM7……测试了一下用这个串口测试工具可以识 ...

看你的图中就少了一对串口:CNCA0、CNCB0
可能你判断了COM?才是串口吧
我是判断类的,不判断名字,有些蓝牙的串口名字也不是COM开头的

你把它改成COM10,COM11看看
也可能Pair 0这一对就是显示不出来
i6950 发表于 2015-7-9 12:53 | 显示全部楼层
少一个,,,,,,,
无标题.png
 楼主| mohanwei 发表于 2015-7-9 14:48 | 显示全部楼层
i6950 发表于 2015-7-9 12:48
看你的图中就少了一对串口:CNCA0、CNCB0
可能你判断了COM?才是串口吧
我是判断类的,不判断名字,有些 ...

的确是只判断COM1-255……你说的这种非典型的就不管了,这么多年还是头一次见到把串口改成这种名字的:lol
 楼主| mohanwei 发表于 2015-7-9 14:49 | 显示全部楼层
目前只检测了设备管理器下面的“端口(COM和LPT)”这个类别,如果不是在这里出现的,应该是检测不到的
i6950 发表于 2015-7-9 17:51 | 显示全部楼层
mohanwei 发表于 2015-7-9 14:48
的确是只判断COM1-255……你说的这种非典型的就不管了,这么多年还是头一次见到把串口改成这种名字的 ...

我改成了COM3、COM4
也只检测到COM3
COM4检测不出来

如果你是用setupapi检测的,应该是能全出来的,它是按类,而不是按昵称
 楼主| mohanwei 发表于 2015-7-9 20:07 | 显示全部楼层
i6950 发表于 2015-7-9 17:51
我改成了COM3、COM4
也只检测到COM3
COM4检测不出来

你留意一下,我上传的图片,根类别是“端口(COM和LPT)”
你上传的,节点类别是“com0com - serial port emulators”
建议看一下“端口(COM和LPT)”,可能里面真的只显示了两个:COM1和COM3:lol
i6950 发表于 2015-7-9 20:19 | 显示全部楼层
mohanwei 发表于 2015-7-9 20:07
你留意一下,我上传的图片,根类别是“端口(COM和LPT)”
你上传的,节点类别是“com0com - serial port ...

没错,在根节点显示了,就不会在端口里再显示
在设备管理器里显示在那个位置,是可以在inf文件里改的
但这并不影响它的真实身份,它仍然是属于端口类

就像ST-LINK,它看起来并不在USB的节点下
但它显然是个USB设备
i6950 发表于 2015-7-9 21:49 | 显示全部楼层
看了几年前的记录,发现是有些设备没有friend name 的原因,
如果没有firend name,就改读device desc就可以了,
你发的那个codeproject的连接,里面也有这样的处理:
  1. // device found
  2. if ( SetupDiGetDeviceRegistryProperty(hDevInfo, pspDevInfoData,
  3. SPDRP_FRIENDLYNAME, &DataT, (PBYTE)buf, sizeof(buf), &nSize) ) {
  4. // do nothing
  5. } else if ( SetupDiGetDeviceRegistryProperty(hDevInfo, pspDevInfoData,
  6. SPDRP_DEVICEDESC, &DataT, (PBYTE)buf, sizeof(buf), &nSize) ) {
  7. // do nothing
  8. } else {
  9. lstrcpy(buf, _T("Unknown"));
  10. }

以前在网上找到一个老外的例子就有这个问题,后来我改了一下就适应那些特殊串口了
修改后可用的代码
  1. DWORD EnumSerialPorts(void)
  2. {
  3. CHAR szPortName[10];
  4. CHAR szFriendlyName[MAX_PATH];
  5. HDEVINFO hDevInfoSet = NULL;
  6. SP_DEVICE_INTERFACE_DATA DevInterfaceData;
  7. SP_DEVINFO_DATA DevInfoData;
  8. DWORD dwReturn,
  9. dwSize,
  10. dwInterfaceIndex = 0;
  11. HKEY hKey;

  12. try
  13. {
  14. hDevInfoSet = SetupDiGetClassDevs(&GUID_DEVINTERFACE_COMPORT,
  15. NULL,
  16. NULL,
  17. DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);

  18. if (hDevInfoSet == INVALID_HANDLE_VALUE)
  19. throw GetLastError();

  20. DevInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);

  21. while (SetupDiEnumDeviceInterfaces(hDevInfoSet,
  22. 0,
  23. &GUID_DEVINTERFACE_COMPORT,
  24. dwInterfaceIndex++,
  25. &DevInterfaceData))
  26. {
  27. DevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);

  28. if (SetupDiGetDeviceInterfaceDetail(hDevInfoSet,
  29. &DevInterfaceData,
  30. NULL,
  31. 0,
  32. NULL,
  33. &DevInfoData))
  34. throw GetLastError();

  35. hKey = SetupDiOpenDevRegKey(hDevInfoSet,
  36. &DevInfoData,
  37. DICS_FLAG_GLOBAL,
  38. 0,
  39. DIREG_DEV,
  40. KEY_QUERY_VALUE);

  41. if (hKey == INVALID_HANDLE_VALUE)
  42. throw GetLastError();

  43. dwSize = sizeof(szPortName);
  44. dwReturn = RegQueryValueEx(hKey,
  45. "PortName",
  46. NULL,
  47. NULL,
  48. (LPBYTE)szPortName,
  49. &dwSize);
  50. RegCloseKey(hKey);

  51. if (dwReturn != ERROR_SUCCESS)
  52. throw dwReturn;

  53. szFriendlyName[0] = '\0';
  54. // 尝试读取FriendName
  55. if (!SetupDiGetDeviceRegistryProperty(hDevInfoSet,
  56. &DevInfoData,
  57. SPDRP_FRIENDLYNAME,
  58. NULL,
  59. (PBYTE)szFriendlyName,
  60. sizeof(szFriendlyName),
  61. NULL))
  62. {
  63. // 该端口没有字段,则读取设备描述字段
  64. if (!SetupDiGetDeviceRegistryProperty(hDevInfoSet,
  65. &DevInfoData,
  66. SPDRP_DEVICEDESC,
  67. NULL,
  68. (PBYTE)szFriendlyName,
  69. sizeof(szFriendlyName),
  70. NULL))

  71. throw GetLastError();
  72. }

  73. printf("%d) %s, %s\n",
  74. dwInterfaceIndex,
  75. szPortName, szFriendlyName);
  76. }
  77. }
  78. catch(DWORD dwError)
  79. {
  80. printf("Error %d on trying enumerate device interfaces.\n",
  81. dwError);

  82. dwReturn = dwError;
  83. }

  84. if (hDevInfoSet)
  85. SetupDiDestroyDeviceInfoList(hDevInfoSet);

  86. return dwReturn;
  87. }


输出结果:
  1. 1) COM1, Communications Port (COM1)
  2. 2) COM3, com0com - serial port emulator
  3. 3) COM4, com0com - serial port emulator
注意到,COM1读到的是friend name;而COM3/4读到的是device desc,没有后面的(COMx)

如果你想显示一致好看的话,就优先读device desc,然后自己按friend name的格式,自己合成就行了





yuangaoping 发表于 2016-11-10 12:27 | 显示全部楼层
又测试了win10-64位系统下,新版本也好用。
另外在win10PE下,也好用,能正确检测到虚拟串口,打开也正常。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部