如何通过友好名称打开串口?
友好名称 = 显示在“设备管理器”中“端口(COM 和 LPT)”下的名称。
编辑:下面提供了两种解决方案。一种使用 WMI,另一种使用 SetupAPI。
friendly name = the name that appears in "Device Manager" under "Ports (COM & LPT).
EDIT: two solutions provided below. One with WMI and another with SetupAPI.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
贴出今晚的代码,供大家欣赏:
Posting tonight's code, for everybody's enjoyment:
本文 的代码为我完成了这项工作(他链接到这篇文章,但他自己似乎没有在这里提供答案)。这是作者的代码:
用法:
This article's code did the job for me (he links to this post, but doesn't seem to have provided an answer here himself). Here's the author's code:
Usage:
我知道这是用 C# 发布的,但我确信这可以轻松转换...
它找到我所有的 com 端口、调制解调器、串行、USB 和蓝牙。
I know this was posted in C#, but I am certain this can easily be converted...
It finds all of my com ports, modem, serial, usb, and bluetooth.
Pavel 的类
SetupDiWrap
工作得很好,它只需要针对 Windows 7 进行一些小调整。希望此更新能够帮助其他人(像我一样)在 Windows 7 中从 VCP 名称获取 COM 端口号
。1 )
SP_DEVINFO_DATA
在 Windows 7 中发生了变化,总长度不再是 28 字节,而是 32 字节长。这对我有用:注意 ulong 代表保留而不是 int。将 uint
cbSize
更改为 intcbSize
为我节省了稍后的转换,否则您可以将其保留为 uint。2) 我还写了这一行:
为了清楚起见,有点不同,将 cbSize 设为 32 位:
3) 我更改
为
The Enumerator is no no no more in
IntPtr
, so you need to callSetupDiGetClassDevs
像这样:在传递枚举器时注意“0”而不是
IntPtr.Zero
。现在,该代码在 Windows 7 中运行起来就像魅力一样!
Pavel's class
SetupDiWrap
works great, it just needs a few small tweaks for Windows 7.Hopefully, this update will help other people struggling (like me) to get COM port numbers from VCP names in Windows 7.
1) The
SP_DEVINFO_DATA
has changed in Windows 7, the total length is no longer 28 bytes, it is 32 bytes long. This is what works for me:Note ulong for Reserved instead of an int. Changing uint
cbSize
to intcbSize
saved me a cast later on, otherwise you can leave it as uint.2) I also wrote the line:
a bit different, for clarity, to get the cbSize to 32 bits:
3) I changed
to
The Enumerator is no longer an
IntPtr
, so you need to callSetupDiGetClassDevs
like this:Note "0" instead of
IntPtr.Zero
when passing the Enumerator.The code now runs like a charm in Windows 7!
尝试在 Win32_SerialPort 类上运行 WMI 查询。下载 WmiCodeCreator进行实验并自动生成 C# 代码。
Try running a WMI query on the Win32_SerialPort class. Download WmiCodeCreator to experiment and auto-generate the C# code.
您可能还想考虑使用注册表,因为我发现 WMI 非常慢(5 或 6 秒)。
在我的例子中,我想识别具有已知友好名称的设备的 COM 端口名称。我使用 regedit 在注册表中搜索了也包含 COM 端口的键中的友好名称。因为我发现的密钥是某种随机 ID 以及其他 10 个 ID,所以我上升了几个级别以找到适合在其中进行搜索的密钥。
我想出的代码如下:
这当然需要根据您的设备在注册表中显示的方式和位置进行修改,但如果您尝试“自动检测”特定类型设备的 Com 端口,那么你应该能够完成这项工作。
请记住,如果您必须递归搜索大量键,那么这会减慢上述解决方案的速度,因此请尝试在注册表中找到正确的位置进行查找。
我还在注册表搜索后添加了 WMI 代码,以防注册表搜索为空:
You might also want to consider using the registry as I have found WMI quite slow (5 or 6 seconds)
In my case I wanted to identify the COM port name of a device with a known friendly name. Using regedit i searched the registry for the friendly name in a key which also contained the COM port. Because the key I found was some sort of random ID along with 10 others I went up a few levels to find a key suitable to search within.
The code I came up with is as follows:
This will of course need to be modified depending upon how and where your device shows up in the registry but if you are trying to 'Auto Detect' the Com Port of a specific type of deivce then you should be able to make this work.
Remember if you have to recursivly search lots of keys then this will slow the above solution down so try and find the right place in the registry to look.
I also included WMI code after the registry search in case the registry search came up empty:
如果您专门使用 USB 设备而不是其他类型的 COM 端口,则跨平台 USB 库 libusbp 有一个示例,您可以运行它来演示如何查找 COM基于 COM 端口的 USB 产品 ID 和供应商 ID 的端口名称。
与尝试在设备管理器中使用友好名称相比,这是一个不同但可能更好的选择。如果您确实想要的话,也许可以扩展 libusbp 以允许访问友好名称。
If you are specifically using USB devices and not some other type of COM port, the cross-platform USB library libusbp has an example you can run that shows how to find the COM port name based on the USB product ID and vendor ID of the COM port.
That is a different but probably better choice than trying to use the friendly name in the Device Manager. Perhaps libusbp could be extended to allow access to the friendly name if you really want that.
我使用 com0com 生成的虚拟端口。
这样,您就可以根据需要命名端口 - 所以我的端口标题如下:
“com0com - 串行端口对仿真器 0 的总线 (COMA <-> COMB)”
使用上面发布的 WMI 代码,您将获得名称
” COMA <-> COMB"
用于该端口。看起来这样的结构不是端口,但上面的代码会将其视为串行端口...
顺便说一句,
“COMA”
是端口的完全有效名称...(这意味着,寻找仅末尾的数字是不够的)。所以我想知道如何才能可靠地区分有效的现有串行端口名称和这种奇怪的结构......
I use virtual ports generated by com0com.
With that you're able to name the ports as you want - so I've port captions like follows:
"com0com - bus for serial port pair emulator 0 (COMA <-> COMB)"
With the above posted WMI code you will then get the name
"COMA <-> COMB"
for that port.It seems such constructs are no ports, but the above code will treat it as serial port...
BTW,
"COMA"
is a totally valid name for a port... (that means, looking for only numbers at the end is not enough).So I wonder how I can reliably distinguish between a valid, existing serial port name and such strange constructs...