C# 与 Arduino COM 访问被拒绝通信

问题描述 投票:0回答:3

我正在 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;
    }

有什么解决办法吗??

wpf serial-port
3个回答
0
投票

这种情况在 Arduino 上经常发生,我个人认为 FTDI 驱动程序有问题......当然不会是他们的第一个问题。发生这种情况时,我要做的就是从 USB 端口物理拔下设备,等待 Windows 发出通知声音,然后重新插入。这似乎会“重置”端口并强制将其打开的任何东西释放它,然后您就可以再次开始了。随着时间的推移,您可能需要经常这样做,因此我唯一的其他建议是使用便宜的 USB 集线器,这样您最终会磨损该集线器上的端口引脚,而不是昂贵的笔记本电脑/台式机。


0
投票

您收到的错误意味着端口已经打开。确保仅调用

ConfigPort()
一次,处理完来自 Arduino 的数据后,使用
sp.Close()
关闭端口。我建议将
sp
转换为全局变量,并订阅 WPF 窗口的 OnClosing 事件,这样您就可以在用户关闭应用程序时关闭端口。


0
投票

如果Arduino IDE打开,在windows中关闭IDE释放端口,问题解决。

© www.soinside.com 2019 - 2024. All rights reserved.