1

我在电路中使用 Arduino-Nano(仿制),允许我以编程方式关闭和打开继电器。我一次连接了几天和几周。有时,Arduino-Nano 和我的计算机之间的串行通信会失败。

在我的程序中,我打开端口,发送一个简单的命令,从设备接收确认,然后关闭端口。我不让它打开。

这是我用来将命令发送到 arduino 的函数:

public static string SendCommandToArduino(string port, string command)
{
    try
    {
        using (var serialPort = new SerialPort(port, 115200, Parity.None, 8, StopBits.One))
        {
            serialPort.ReadTimeout = 100;
            serialPort.WriteTimeout = 100;
            serialPort.Open();
            serialPort.WriteLine(command);
            return serialPort.ReadLine().Replace("\r", "");
        }
    }
    catch (Exception e)
    {
        Log.Write(e);
    }

    return string.Empty;
}

当它失败并且我尝试连接到它时,我得到以下异常:

A device attached to the system is not functioning.

   at System.IO.Ports.InternalResources.WinIOError(Int32 errorCode, String str)
   at System.IO.Ports.InternalResources.WinIOError()
   at System.IO.Ports.SerialStream.InitializeDCB(Int32 baudRate, Parity parity, Int32 dataBits, StopBits stopBits, Boolean discardNull)
   at System.IO.Ports.SerialStream..ctor(String portName, Int32 baudRate, Parity parity, Int32 dataBits, StopBits stopBits, Int32 readTimeout, Int32 writeTimeout, Handshake handshake, Boolean dtrEnable, Boolean rtsEnable, Boolean discardNull, Byte parityReplace)
   at System.IO.Ports.SerialPort.Open()

该系统将正常工作数周,然后有时我会遇到上述异常。没有特定的模式,因此几乎不可能重现该问题。我可以通过拔下 Arduino 的 USB 线并在几秒钟后将其重新插入来轻松修复它。

但是,我将此 Arduino 用作自动夜间测试的一部分,因此当它失败时,我通常不会坐在那里准备拔掉插头并重新插入。

我已经用另外 2 个有源集线器替换了我正在使用的 USB 集线器,并用质量好的 USB 线替换了 USB 线。这似乎降低了失败的频率,但有时它仍然会起作用。

我用的是仿制的arduino,不是原版的。这是问题吗?如果我使用 Arduino Uno 或 Mega 而不是 Nano,我会不会有更少的问题?

我认为 Windows 10 有时可能会与 COM 端口混淆并失去连接。

有没有办法以编程方式告诉 Windows 以编程方式重启或重置 com 端口?我的应用程序在 C# 中。

4

1 回答 1

1

无法说出您的确切问题是什么,但对于简单的串行通信设备来说,它们偶尔会失去连接是非常常见的问题。

您必须以一种在任何情况下都会重新连接的方式建立连接,除非您特别想让它断开连接。

于 2020-09-23T11:58:43.097 回答