发新帖我要提问
123
返回列表
打印
[开发工具]

请帮忙测试一下这个支持USB虚拟串口热插拔的串口调试助手

[复制链接]
楼主: mohanwei
手机看帖
扫描二维码
随时随地手机跟帖
41
mohanwei|  楼主 | 2015-7-9 12:20 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
i6950 发表于 2015-7-9 11:26
我用的是com0com
你自己装个com0com更容易调试

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


至于64位win7,不知道有什么不一样,暂时就不管了:lol

使用特权

评论回复
42
mohanwei|  楼主 | 2015-7-9 12:22 | 只看该作者
i6950 发表于 2015-7-9 11:35
ReadFile不是要传buffer的长度进去吗? 难道你没用上?

有啊,只是又封装了一道,看起来简洁点

使用特权

评论回复
43
i6950| | 2015-7-9 12:48 | 只看该作者
mohanwei 发表于 2015-7-9 12:20
刚装了个com0com,装完默认它默认就添加了一对串口:COM6和COM7……测试了一下用这个串口测试工具可以识 ...

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

你把它改成COM10,COM11看看
也可能Pair 0这一对就是显示不出来

使用特权

评论回复
44
i6950| | 2015-7-9 12:53 | 只看该作者
少一个,,,,,,,

使用特权

评论回复
45
mohanwei|  楼主 | 2015-7-9 14:48 | 只看该作者
i6950 发表于 2015-7-9 12:48
看你的图中就少了一对串口:CNCA0、CNCB0
可能你判断了COM?才是串口吧
我是判断类的,不判断名字,有些 ...

的确是只判断COM1-255……你说的这种非典型的就不管了,这么多年还是头一次见到把串口改成这种名字的:lol

使用特权

评论回复
46
mohanwei|  楼主 | 2015-7-9 14:49 | 只看该作者
目前只检测了设备管理器下面的“端口(COM和LPT)”这个类别,如果不是在这里出现的,应该是检测不到的

使用特权

评论回复
47
i6950| | 2015-7-9 17:51 | 只看该作者
mohanwei 发表于 2015-7-9 14:48
的确是只判断COM1-255……你说的这种非典型的就不管了,这么多年还是头一次见到把串口改成这种名字的 ...

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

如果你是用setupapi检测的,应该是能全出来的,它是按类,而不是按昵称

使用特权

评论回复
48
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

使用特权

评论回复
49
i6950| | 2015-7-9 20:19 | 只看该作者
mohanwei 发表于 2015-7-9 20:07
你留意一下,我上传的图片,根类别是“端口(COM和LPT)”
你上传的,节点类别是“com0com - serial port ...

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

就像ST-LINK,它看起来并不在USB的节点下
但它显然是个USB设备

使用特权

评论回复
50
i6950| | 2015-7-9 21:49 | 只看该作者
看了几年前的记录,发现是有些设备没有friend name 的原因,
如果没有firend name,就改读device desc就可以了,
你发的那个codeproject的连接,里面也有这样的处理:
// device found
if ( SetupDiGetDeviceRegistryProperty(hDevInfo, pspDevInfoData,
SPDRP_FRIENDLYNAME, &DataT, (PBYTE)buf, sizeof(buf), &nSize) ) {
// do nothing
} else if ( SetupDiGetDeviceRegistryProperty(hDevInfo, pspDevInfoData,
SPDRP_DEVICEDESC, &DataT, (PBYTE)buf, sizeof(buf), &nSize) ) {
// do nothing
} else {
lstrcpy(buf, _T("Unknown"));
}

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

try
{
hDevInfoSet = SetupDiGetClassDevs(&GUID_DEVINTERFACE_COMPORT,
NULL,
NULL,
DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);

if (hDevInfoSet == INVALID_HANDLE_VALUE)
throw GetLastError();

DevInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);

while (SetupDiEnumDeviceInterfaces(hDevInfoSet,
0,
&GUID_DEVINTERFACE_COMPORT,
dwInterfaceIndex++,
&DevInterfaceData))
{
DevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);

if (SetupDiGetDeviceInterfaceDetail(hDevInfoSet,
&DevInterfaceData,
NULL,
0,
NULL,
&DevInfoData))
throw GetLastError();

hKey = SetupDiOpenDevRegKey(hDevInfoSet,
&DevInfoData,
DICS_FLAG_GLOBAL,
0,
DIREG_DEV,
KEY_QUERY_VALUE);

if (hKey == INVALID_HANDLE_VALUE)
throw GetLastError();

dwSize = sizeof(szPortName);
dwReturn = RegQueryValueEx(hKey,
"PortName",
NULL,
NULL,
(LPBYTE)szPortName,
&dwSize);
RegCloseKey(hKey);

if (dwReturn != ERROR_SUCCESS)
throw dwReturn;

szFriendlyName[0] = '\0';
// 尝试读取FriendName
if (!SetupDiGetDeviceRegistryProperty(hDevInfoSet,
&DevInfoData,
SPDRP_FRIENDLYNAME,
NULL,
(PBYTE)szFriendlyName,
sizeof(szFriendlyName),
NULL))
{
// 该端口没有字段,则读取设备描述字段
if (!SetupDiGetDeviceRegistryProperty(hDevInfoSet,
&DevInfoData,
SPDRP_DEVICEDESC,
NULL,
(PBYTE)szFriendlyName,
sizeof(szFriendlyName),
NULL))

throw GetLastError();
}

printf("%d) %s, %s\n",
dwInterfaceIndex,
szPortName, szFriendlyName);
}
}
catch(DWORD dwError)
{
printf("Error %d on trying enumerate device interfaces.\n",
dwError);

dwReturn = dwError;
}

if (hDevInfoSet)
SetupDiDestroyDeviceInfoList(hDevInfoSet);

return dwReturn;
}


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

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





使用特权

评论回复
51
yuangaoping| | 2016-11-10 12:27 | 只看该作者
又测试了win10-64位系统下,新版本也好用。
另外在win10PE下,也好用,能正确检测到虚拟串口,打开也正常。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则