我正在试着写一个程序,使用一个arduino mega和一个基于FTDI的USB to RS485适配器。
我想让程序变得用户友好,因此我不会让用户手动检查COM端口号,但我想自动检测它。这是一段代码片段
ManagementScope scope = new ManagementScope();
SelectQuery query = new SelectQuery("SELECT * FROM Win32_SerialPort");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
try
{
foreach (ManagementObject item in searcher.Get())
{
String description = item["Description"].ToString();
String deviceID = item["DeviceID"].ToString();
Console.WriteLine("Porta " + description + " deviceID " + deviceID);
if (description.Contains("USB Serial Port"))
return deviceID;
}
}
catch (ManagementException)
{
}
我不能理解的一点是,为什么我可以找到Arduino的USB端口(匹配description.Contains("Arduino")
),但找不到USB RS485端口的com端口。
你知道为什么会发生这种情况吗?查询SELECT * FROM Win32_SerialPort
是否错误?
发布于 2013-04-23 19:10:12
嗯,在研究了几个论坛之后,我发现如果我运行查询SELECT * FROM Win32_PnPEntity
,就会列出与USB/RS485适配器相关的com端口。
但我真的不明白为什么arduino的串行端口是通过查询显示的,而另一个端口是通过另一个查询显示的……我的意思是,这些都是uSB<->串行适配器!
发布于 2013-04-30 19:56:02
我没有USBRS485适配器,但我怀疑它们不属于“串行端口”类别(似乎是为RS232接口保留的),这可能是它们不出现在Win32_SerialPort查询结果中的原因。
为了检测和Arduino板的连接,我查看了以下注册表项:
HKLM\HARDWARE\DEVICEMAP\SERIALCOMM
对于以下条目:
\Device\VCP0
(VCP是要查找的前缀)。
也许您也可以查看这个注册表项,或者查看它的父项DEVICEMAP,看看当您连接FTDI RS485适配器时会发生什么。此时,检测其中一个注册表项内容的更改应该很简单。
HTH
发布于 2020-03-05 19:32:17
正如@Marcello Romani指出的那样,FTDI不属于“串口”类别。尽管我迟到了,但我最近遇到了这个问题,我用另一个查询解决了这个问题。您可以查询Win32_PnPEntity class.One,而不是在WIN32_SerialPort中进行搜索。使用此类的缺点是查询速度很慢。
using (var searcher = new ManagementObjectSearcher
("SELECT * FROM Win32_PnPEntity"))
{
string[] portnames = SerialPort.GetPortNames();
var ports = searcher.Get().Cast<ManagementBaseObject>().ToList();
foreach (ManagementBaseObject queryObj in ports)
{
}
}
https://stackoverflow.com/questions/16163773
复制相似问题