我正在尝试编写一个使用arduino mega和基于FTDI的USB转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
是错误的吗?
答案 0 :(得分:1)
好吧,在研究了几个论坛后,我发现如果运行查询SELECT * FROM Win32_PnPEntity
,会列出与USB / RS485适配器关联的com端口。
但我真的不明白为什么arduino的串口是由查询显示的,而另一个端口是另一个查询....我的意思是,这些都是uSB< - >串口适配器!
答案 1 :(得分:0)
我没有USB< - > RS485适配器,但我怀疑它们不属于“串口”类别(这似乎是为RS232接口保留的),这可能就是他们不知道的原因。 t出现在Win32_SerialPort查询结果中。
要检测和Arduino板的连接,我会查看此注册表项:
HKLM\HARDWARE\DEVICEMAP\SERIALCOMM
用于
等条目\Device\VCP0
(VCP是要查找的前缀)。
也许您也可以查看此注册表项,或者查看其父项DEVICEMAP,并查看连接FTDI RS485适配器时会发生什么。 在这一点上检测其中一个注册表项内容的更改应该是直截了当的。
HTH
答案 2 :(得分:0)
这可能适合你。我用它来动态读取系统上Arduino的端口号。在这里
description.Contains(" uino&#34)
是为两个板块的变量寻找Arduino和Genuino关键字。
public string detectArduinoPort()
{
ManagementScope mScope = new ManagementScope();
SelectQuery query = new SelectQuery("SELECT * FROM Win32_SerialPort");
ManagementObjectSearcher objectList = new ManagementObjectSearcher(mScope, query);
try
{
foreach (ManagementObject obj in objectList.Get())
{
string description = obj["Description"].ToString();
string deviceId = obj["DeviceID"].ToString();
if (description.Contains("uino"))
{
return deviceId;
}
}
}
catch (Exception)
{
}
return "";
}
答案 3 :(得分:0)
@Marcello Romani指出FTDI不会属于“串行端口”类别。即使我迟到了,我最近也遇到了这个问题,并使用另一个查询解决了这个问题。您可以查询Win32_PnPEntity类而不是在WIN32_SerialPort中进行搜索。使用此类的缺点是查询速度慢。
s = df.stack().value_counts()
print (s)
4 6
5 4
3 3
9 2
7 2
2 2
1 2
8 1
6 1
0 1
dtype: int64
print (s.index[0])
4
print (s.iat[0])
6
答案 4 :(得分:-1)
基本上,这是由于HID(人机接口设备)
我认为这是由于arduino板提供的HID。 Arduino硬件(以及微控制器)使用HID与PC直接通信(因此,不需要额外的设备)。并且HID可以表现为鼠标,键盘或简单的串行设备(它“简单地”将自己声明为PC作为串行编译器)。所以不知何故,在与PC通信时会有一些“智能”的方式。
另一方面,USBtoSerial转换器和一些Arduino板,如嵌入FTDI(或CH340)的Arduino Nano,这些“被迫”表现为正常情况,因为没有智能背后(一个在HID背后。)