我目前正在使用C#中的SerialPort
类进行项目,以便与我工作的公司使用的基于RS232的校准设备进行通信。在SerialPort类中,有一个名为GetPortNames()
的静态方法。
不幸的是,Windows在保持旧的端口条目方面存在严重问题。如果我从我的机器上调用GetPortNames()
,它将返回以下端口:
COM3
COM4
COM1
在这些端口中,现在只存在一个端口。我的电脑背面有一块PCIe RS232卡。这被指定为COM1
。
其他两个端口(COM3
和COM4
)是由USB-to-Null Modem电缆创建的。这些条目仍存在于注册表中,即使电缆早已分离(COM8已存在一段时间,但在常规插拔USB电缆几次后被删除)。
这对我没问题。我总是可以打开Putty或TeraTerm并检查可用的COM端口,直到找到正确的端口。对于将使用该程序的技术人员来说,这是不合适的。我不知道COM端口总是和它们经常移动USB电缆一样。
有没有办法(最好用C#编程)我可以删除这些陈旧的条目,或者至少验证哪些是活跃的?
备注:
来自SerialPort.GetPortNames()MSDN文档:
说明
未指定从GetPortNames返回的端口名称的顺序。
使用GetPortNames方法查询当前计算机以获取有效串行端口名称列表。例如,您可以使用此方法确定COM1和COM2是否是当前计算机的有效串行端口。
端口名称是从系统注册表获取的(例如,HKEY_LOCAL_MACHINE \ HARDWARE \ DEVICEMAP \ SERIALCOMM)。 如果注册表包含陈旧或不正确的数据,则GetPortNames方法将返回不正确的数据。
以下问题:Removing COM Ports in Windows programmatically (Setup API ? )已有两年,并且不尽如人意。唯一的答案(本质上“看看程序X的源代码并尝试制作类似的东西”)对我来说毫无用处。
答案 0 :(得分:1)
不要担心尝试使计算机正确。担心确保连接到正确的设备。枚举端口然后尝试打开并与每个端口通信。您应该有一个握手/识别类型命令,您可以将命令发送到您尝试连接的串行设备。如果握手成功,您就知道自己有设备。