我正在 Arduino 上使用指纹传感器,但有时,在运行时,我的 WPF 应用程序会在 sp.Open() 上抛出异常,显示“COM3”访问被拒绝”
这是c#上的代码:
public string ConfigPort()
{
SerialPort sp = new SerialPort();
sp.BaudRate = 9600;
sp.PortName = AutodetectArduinoPort();
sp.Open();
string s = "";
while (true)
{
s = sp.ReadLine();
Console.WriteLine(s);
return s;
}
}
这是自动检测ArduinoPort方法:
public string AutodetectArduinoPort()
{
ManagementScope connectionScope = new ManagementScope();
SelectQuery serialQuery = new SelectQuery("SELECT * FROM Win32_SerialPort");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(connectionScope, serialQuery);
try
{
foreach (ManagementObject item in searcher.Get())
{
string desc = item["Description"].ToString();
string deviceId = item["DeviceID"].ToString();
if (desc.Contains("Arduino"))
{
return deviceId;
}
}
}
catch (ManagementException e)
{
/* Do Nothing */
}
return null;
}
有什么解决办法吗??
这种情况在 Arduino 上经常发生,我个人认为 FTDI 驱动程序有问题......当然不会是他们的第一个问题。发生这种情况时,我要做的就是从 USB 端口物理拔下设备,等待 Windows 发出通知声音,然后重新插入。这似乎会“重置”端口并强制将其打开的任何东西释放它,然后您就可以再次开始了。随着时间的推移,您可能需要经常这样做,因此我唯一的其他建议是使用便宜的 USB 集线器,这样您最终会磨损该集线器上的端口引脚,而不是昂贵的笔记本电脑/台式机。
您收到的错误意味着端口已经打开。确保仅调用
ConfigPort()
一次,处理完来自 Arduino 的数据后,使用 sp.Close()
关闭端口。我建议将 sp
转换为全局变量,并订阅 WPF 窗口的 OnClosing 事件,这样您就可以在用户关闭应用程序时关闭端口。
如果Arduino IDE打开,在windows中关闭IDE释放端口,问题解决。