1

我试图防止在我的应用程序中使用串行连接的用户的任何奇怪行为。

我的应用程序通过USB->serial converter连接到设备。在我确定端口可用、已连接并准备好后,我正在设置环境以发送数据,但我也想准备好是否有任何用户拔下通信电缆,所以我使用以下代码。

try
{
  serialPort.WriteLine("BT\r"); 
}
catch (IOException ioe)
{
  Console.WriteLine(ioe.Message);
  currentCommunicationState = DEVICE_COMMUNICATION_STATES.IDLE;
  // other stuff which set application in idle mode; buttons statuses, etc
}

上面的异常处理得很好。应用程序进入空闲模式,我可以使用它,但是......当我关闭应用程序时,我得到下一个异常,没有任何更多指定的细节。我找不到引发第二个异常的地方或如何保持这种情况。

System.IO.IOException was unhandled
Message="Specified port doesn't exist"
Source="System"
StackTrace:
   w System.IO.Ports.InternalResources.WinIOError(Int32 errorCode, String str)
   w System.IO.Ports.SerialStream.Dispose(Boolean disposing)
   w System.IO.Ports.SerialStream.Finalize()
InnerException:

从控制台登录

Port 'COM29' nie istnieje. \\port COM28 doesn't exist - called from my exception handler
A first chance exception of type 'System.IO.IOException' occurred in System.dll
The thread 0x14d4 has exited with code 0 (0x0).
The thread 0x1e98 has exited with code 0 (0x0).
4

2 回答 2

0

抛出第一个异常时,您需要摆脱SerialStream用于通信的异常。您得到的例外是试图处理该流的程序。

在您的异常处理程序中,关闭串行端口流。

于 2013-02-19T13:26:09.060 回答
0

看来这篇文章有一些关于这个问题的信息。简而言之,Dispose移植的方法是有缺陷的,从而导致终结器中的错误。IMO 这是错误的行为。

如果您确定在正确的时间处理了所有内容并且仍然遇到此问题,则应将 Port 类子类化以在Dispose(bool disposing)方法的覆盖中放置一些更健壮的错误处理。您可以将基类调用包装在一些 try/catch 中。

于 2013-02-19T13:29:43.830 回答