检测 Windows 上所有可用串行端口的正确方法是什么?
有多种方法可以在 Windows 下列出串行端口,但我不确定什么是正确的方法:检测所有可用串行端口的方法。
一个很好的代码示例是 http://www.naughter.com/enumser.html - 那里有 9 种(九种!)枚举串行设备的方法。
问题是:最好的方法是什么。
要求:
- 不打开端口以检查它们是否可用。
- 能够检测与
COMx
名称不同的端口。 - 在 Windows XP SP2 或更高版本上工作
There are several ways to list serial ports under Windows but I'm not sure what is the proper way: the way that does detect all serial ports that are available.
One good code example is http://www.naughter.com/enumser.html - where there are 9 (nine!) ways of enumerating serial devices.
The question is: what is the optimal way of doing it.
Requirements:
- to not open ports in order to check if they are available.
- to be able to detect ports with different names than
COMx
. - to work on Windows XP SP2 or above
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
修改了 @Dženan 答案以使用宽字符并返回整数列表
Modified @Dženan answer to use wide characters and returning list of ints
如果您可以访问注册表,则
HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM
项包含 Windows 当前支持的 COM 端口列表(在某些情况下,此信息可能已过时/不正确;例如,我怀疑,当提供串行端口的即插即用设备尚未完成检测/安装或最近被删除时)。这就是 .NET Framework 的
SerialPort 的方式.GetPortNames()
方法报告可用的COM端口,上述信息来自链接页面。If you can access the registry, the
HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM
key contains a list of COM ports Windows currently supports (in some cases, this information may be stale/incorrect; like, I suspect, when a plug & play device providing serial ports has not completed detection/installation or has been recently removed).This is the way .NET Framework's
SerialPort.GetPortNames()
method reports available COM ports, and the above information is derived from the linked page.这是 @michael-jacob-mathew 答案的现代化版本:
它在我的计算机上产生以下输出:
This is a modernized version of @michael-jacob-mathew's answer:
It produces the following output on my computer:
串行端口是非常简单的设备,可以追溯到计算硬件的石器时代。他们不支持即插即用玩,没有办法知道有人插入了设备。您唯一能做的就是发现哪些端口可用,SerialPort.GetPortNames() 返回列表。一些 USB 模拟器可以生成一个描述性名称来配合端口名称,您可以通过 WMI、Win32_SerialPort 类来发现这些名称。
这些都不能帮助您发现哪个 COM 端口连接到特定设备。只有人类知道,她将电缆实际插入了连接器。您需要提供一个配置 UI,让用户选择端口号。组合框即可完成工作。将选择保存在配置数据中,下次程序启动时设备很可能仍连接到同一端口。
Serial ports are very simple devices, dating from the stone age of computing hardware. They don't support Plug & Play, there is no way to tell that somebody plugged in a device. The only thing you can do is discover what ports are available, the SerialPort.GetPortNames() returns the list. Some USB emulators can generate a descriptive name to go with the port name, you can discover those with WMI, Win32_SerialPort class.
None of which helps you discover what COM port is connected to a particular device. Only a human knows, she physically plugged the cable in the connector. You'll need to provide a config UI that lets the user select the port number. A combo box gets the job done. Save the selection in your config data, it is very likely that the device is still connected to the same port the next time your program starts.
枚举 COM 端口的正确方法是使用 SetupDi 函数。
对于最多 256 个端口名称,尝试使用 CreateFile() 打开 COM 端口太慢,并且会跳过已打开的端口名称。
对于 Windows,所有串行端口都有一个与“COM%u”匹配的别名。当然!
从Windows 98开始就提供了必要的SetupDi函数集,因此您的软件可以保持相当高的向后兼容性级别。
仅当 DOS 或 Windows < 时需要98,打开枚举就可以,而且速度很快,因为此类系统最多只支持COM4。
此处填写 ComboBoxEx 的示例:
The right way to enumerate COM ports is using SetupDi functions.
Trying to open COM ports using CreateFile() is too slow for up to 256 port names, and will skip over already-open ones.
For Windows, all serial ports have an alias matching to "COM%u". Sure!
The necessary set of SetupDi functions is available since Windows 98, so your software can keep a quite high backward-compatibility level.
Only when DOS or Windows < 98 is required, enumerate-by-opening is OK and fast as such systems only support up to COM4.
An example for filling a ComboBoxEx here:
您可以检查 Windows 注册表以列出所有 COM 端口。这是我的代码> github 文件
You can check the windows registry base to list all COM ports. Here is my code > github file