【发布时间】:2020-09-23 19:58:43
【问题描述】:
我在电路中使用 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 用作自动夜间测试的一部分,因此当它失败时,我通常不会坐在那里准备拔掉电源并重新插入。
我已将我正在使用的 USB 集线器更换为 2 个其他有源集线器,并已将 USB 线更换为优质的 USB 线。这似乎降低了失败的频率,但有时还是会发生。
我使用的是仿制的 arduino,而不是原版。这是问题吗?如果我使用 Arduino Uno 或 Mega 而不是 Nano,问题会更少吗?
我认为 Windows 10 有时可能会与 COM 端口混淆并失去连接。
有没有办法以编程方式告诉 Windows 以编程方式重启或重置 com 端口?我的应用程序是 C#。
【问题讨论】:
标签: c# arduino serial-port arduino-nano com-port