Gra*_*amS 49 winapi serial-port
我有一些遗留代码,它通过调用EnumPorts()函数然后过滤以"COM"开头的端口名称来提供PC上可用COM端口的列表.
出于测试目的,如果我可以将此代码用于com0com这样的代码,它将非常有用,它提供了作为零调制解调器循环在一起的虚拟COM端口对.
但是该EnumPorts()函数找不到com0com端口(即使没有过滤"COM").HyperTerminal和SysInternals PortMon都可以看到它们,所以我确信它安装正确.
那么还有其他一些Win32功能可以提供可用串口的明确列表吗?
Gra*_*amS 76
Nick D建议的EnumSerialPorts v1.20使用九种不同的方法列出串口!虽然结果似乎有所不同,但我们肯定不会做出选择.
为了省去其他人的麻烦,我会在这里列出并表明他们com0com在我的PC(XP专业版SP2)上找到端口的成功:
按照Wael Dalloul的建议创建文件("COM"+ 1-> 255)
✔找到com0com端口,耗时234ms.
QueryDosDevice()
✔找到com0com端口,耗时0ms.
GetDefaultCommConfig("COM"+ 1-> 255)
✔找到com0com端口,耗时235ms.
使用SETUPAPI.DLL调用"SetupAPI1"
✔发现com0com端口,也报告了"友好名称",耗时15ms.
"SetupAPI2"使用SETUPAPI.DLL调用
✘没有找到com0com端口,报告"友好名称",耗时32ms.
EnumPorts()
✘报告了一些非COM端口,没有找到com0com端口,耗时15ms.
使用WMI调用
✔发现com0com端口,也报告"友好名称",花了47ms.
COM数据库使用调用MSPORTS.DLL✔
/✘报告了一些非COM端口,发现com0com端口,耗时16ms.
迭代注册表项HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP \SERIALCOMM✔
找到com0com端口,耗时0ms.这显然是SysInternals PortMon使用的.
基于这些结果,我认为WMI方法可能最适合我的要求,因为它相对较快,作为奖励,它还提供了友好的名称(例如"通信端口(COM1)","com0com - 串行端口仿真器").
Nic*_*kis 11
看起来这不是一项简单的任务.
看看这个:EnumSerialPorts v1.20
你可以循环播放例如1到50并尝试打开每个端口.如果端口可用,则打开将起作用.如果端口正在使用中,您将收到共享错误.如果未安装端口,则会收到文件未找到错误.
打开端口使用CreateFile API:
HANDLE Port = CreateFile(
"\\\\.\\COM1",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
Run Code Online (Sandbox Code Playgroud)
然后检查结果.
| 归档时间: |
|
| 查看次数: |
58081 次 |
| 最近记录: |