0

我正在使用 VB.NET SerialPort 类,并创建了一个对象集合,这些对象代表我们的硬件设备的配置,以便我可以通过 USB 虚拟串行端口更改配置和更新设备。这些对象具有多态性,每个设备最终都继承自一个名为 CmdSender 的类,该类处理 COM IO。当最终删除所有已知错误并将应用程序发布到另一台 PC(安装了 .NET 运行时但未安装 Visual Studio)时,从我的代码调用 SerialPort.Write(string) 时偶尔会引发无法捕获的异常。

这是错误消息和堆栈跟踪的最顶层部分。

System.IO.IOException:连接到系统的设备无法正常工作。

在 System.IO.Ports.InternalResources.WinIOError(Int32 errorCode, String str) 在 System.IO.Ports.SerialStream.EndWrite(IAsyncResult asyncResult) 在 System.IO.Ports.SerialStream.Write(Byte[] 数组,Int32 偏移量, Int32 计数,Int32 超时)在 System.IO.Ports.SerialPort.Write(字符串文本)在 TDDevice.CmdSender.SendPure(字符串 Cmd,布尔 AddCheckSum)

我在网上找不到任何解决此问题的方法。还值得注意的是,当抛出此异常时,应用程序不能简单地重新启动(尽管这仍然不理想)但必须移除 USB COM 设备并重新插入机器,如果不这样做,我的应用程序会警告我没有 COM 端口可以找到(我已经内置的检查),这告诉我.NET 在此之后无法与 COM 端口交互,我还没有测试其他 API 在发生这种情况后是否仍然能够使用该端口以确认问题是否仅影响 .NET 或端口本身(但设备管理器仍列出端口)。

我的问题是为什么会发生这种情况,如何预防?(C# 中的任何答案都应该没问题,因为我希望可以翻译,但 VB 将不胜感激)

4

1 回答 1

0

我在串行端口与 PIC 微控制器通信方面做了一些工作,并遇到了这样的错误。我当时的解决方案是发送数据后关闭端口,需要再次发送时再打开。我认为由于是 USB 转换器,因此设备可能会进入睡眠模式或类似的模式。

 sendData(){
     open port
     send data
     wait for response if needed
     close port
    }

抱歉没有发布代码,但你明白了

于 2015-04-23T15:57:39.430 回答