GetPortNames()返回陈旧数据/删除Windows中过时的comport条目?

时间:2013-11-06 21:43:23

标签: c# windows serial-port registry

我目前正在使用C#中的SerialPort类进行项目,以便与我工作的公司使用的基于RS232的校准设备进行通信。在SerialPort类中,有一个名为GetPortNames()的静态方法。

不幸的是,Windows在保持旧的端口条目方面存在严重问题。如果我从我的机器上调用GetPortNames(),它将返回以下端口:

COM3
COM4
COM1

在这些端口中,现在只存在一个端口。我的电脑背面有一块PCIe RS232卡。这被指定为COM1

其他两个端口(COM3COM4)是由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的源代码并尝试制作类似的东西”)对我来说毫无用处。

1 个答案:

答案 0 :(得分:1)

不要担心尝试使计算机正确。担心确保连接到正确的设备。枚举端口然后尝试打开并与每个端口通信。您应该有一个握手/识别类型命令,您可以将命令发送到您尝试连接的串行设备。如果握手成功,您就知道自己有设备。