C# GetPortNames()在Windows中返回过时的数据/删除过时的组件项?
我目前正在从事一个项目,使用C#中的类与我工作的公司使用的基于RS232的校准设备进行通信。在SerialPort类中,有一个名为的静态方法 不幸的是,Windows在保留过时的端口条目方面存在严重问题。如果我从我的计算机调用C# GetPortNames()在Windows中返回过时的数据/删除过时的组件项?,c#,windows,serial-port,registry,C#,Windows,Serial Port,Registry,我目前正在从事一个项目,使用C#中的类与我工作的公司使用的基于RS232的校准设备进行通信。在SerialPort类中,有一个名为的静态方法 不幸的是,Windows在保留过时的端口条目方面存在严重问题。如果我从我的计算机调用GetPortNames(),它将返回以下端口: COM3 COM4 COM1 在这些端口中,目前只有一个物理存在。我的电脑背面有一个PCIe RS232卡。这被指定为COM1 其他两个端口(COM3和COM4)由USB至空调制解调器电缆创建。这些条目仍然存在于注册表中,即
GetPortNames()
,它将返回以下端口:
COM3
COM4
COM1
在这些端口中,目前只有一个物理存在。我的电脑背面有一个PCIe RS232卡。这被指定为COM1
其他两个端口(COM3
和COM4
)由USB至空调制解调器电缆创建。这些条目仍然存在于注册表中,即使这些电缆早已被分离(COM8存在了一段时间,但在例行地插拔USB电缆几次后被删除)
这对我来说没关系。我总是可以打开Putty或TeraTerm并检查可用的COM端口,直到找到正确的端口。这对将使用此程序的技术人员来说是不好的。我不知道COM端口是否总是和他们经常移动USB电缆一样
有没有办法(最好是用C语言编程)删除这些过时的条目,或者至少验证哪些条目是活动的
注意事项:
从SerialPort.GetPortNames()MSDN文档:
备注
- 未指定从GetPortNames返回的端口名的顺序
- 使用GetPortNames方法查询当前计算机的有效串行端口名列表。例如,您可以使用此方法确定COM1和COM2是否为当前计算机的有效串行端口
- 端口名从系统注册表中获取(例如,HKEY\U LOCAL\U MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM)如果注册表包含过时或不正确的数据,则GetPortNames方法将返回不正确的数据。
下面的问题是:你已经两年了,不满意。唯一的答案(基本上是“看一看程序X的源代码,并尝试制作类似的东西”)对我来说是无用的 不要担心如何使电脑正常运行。担心是否连接到正确的设备。枚举端口,然后尝试打开并与每个端口通信。您应该有一个握手/标识类型的命令,可以发送到您尝试连接的串行设备。如果你成功地握手,你就知道你有一台设备。不要担心如何使电脑正常工作。担心是否连接到正确的设备。枚举端口,然后尝试打开并与每个端口通信。您应该有一个握手/标识类型的命令,可以发送到您尝试连接的串行设备。如果握手成功,您就知道您有一台设备。我认为您可能只需尝试打开端口(不发送数据),如果出现错误,请将其从您自己的本地列表中删除。我还没试过这个,但可能有用。这也可能会导致其他正在使用的端口也消失,但这只会帮助缩小正确的端口:)Windows根本不涉及,由设备驱动程序来编写这些注册表项。除此之外,模拟串行端口的设备驱动程序非常糟糕。处理古怪端口的最佳方法是卸载它们。我认为您可能只需尝试打开端口(不发送数据),如果出现错误,请将其从您自己的本地列表中删除。我还没试过这个,但可能有用。这也可能会导致其他正在使用的端口也消失,但这只会帮助缩小正确的端口:)Windows根本不涉及,由设备驱动程序来编写这些注册表项。除此之外,模拟串行端口的设备驱动程序非常糟糕。对付脾气暴躁的人最好的办法就是卸载它们。这并不总是可能的。许多NMEA设备都是只会说话的。“别担心……”这是浪费时间,而且看不到有多少串行端口是愚蠢的,不管它们是空闲的、忙碌的、我们的还是外国的,这并不总是可能的。很多NMEA设备都是只会说话的。“别担心……”这是浪费时间,而且不知道有多少串行端口是空闲的、忙碌的、我们的还是外国的都是愚蠢的