我正在编写一个向 Arduino 发送一些简单命令的 C# 程序。通过 USB 串行虚拟端口。
有时会发生程序挂起,即使代码受 try/catch 块保护。
当我看到问题时,问题似乎在于关闭端口。
功能非常简单:
void Send() {
try {
Debug.WriteLine("SR1 "+rel+" "+status);
_serialArduino.Open();
Debug.WriteLine("SR2");
_serialArduino.WriteLine(string.Format("switch {0} {1}\n", rel, Convert.ToSByte(status)));
Debug.WriteLine("SR3 '"+_serialArduino.ReadLine()+"'");
_serialArduino.Close();
Debug.WriteLine("SR4");
Thread.Sleep(400);
} catch (Exception e) {
LogManager.Write(string.Format("ERR SwitchRel({0}, {1}) - {2}", rel, status, e.Message));
}
}
我在 Close 函数期间读到了一个问题,但在这种情况下,没有定义 DataReceived 事件处理程序(==null)。
任何想法?
* 编辑添加了一些细节 *
经过几天的调试和日志分析,我发现了以下内容:
- 我正在使用运行 Win7Embedded Standard 的设备
- 该应用程序是用 C# 编写的
- 一段时间后(或者可能是由于未知的原因,到目前为止)连接 Arduino 的端口从枚举端口列表中消失了
- 该程序最初在我的日志中报告“设备已断开连接”,然后是“端口 COM9 不存在”消息
- 设备管理器在“端口”树上报告 COM9 (!!)
- 如果我关闭程序并重新运行它,它会报告“COM9 不存在”,如果我列出端口,则 COM9 不会出现
我的猜测是usbser驱动程序一团糟。
到目前为止,唯一的解决方案是重置电路板。
有没有办法在不重新启动的情况下重置驱动程序并检查它是否以已知状态返回?或者也许是没有检测到端口的 DotNet 框架?