0

所以我一直在与这个问题作斗争大约一个星期,并认为我知道这个问题,但我不想在那里报告答案,直到我把它固定下来。

简而言之,我在尝试使用该SerialPort.Open()命令时收到 IOException。事实证明,这是非常常见的,大多数终端程序实际上也是如此,但他们只是忽略了它。请阅读我上面的帖子以获取完整的故事。现在我想做的是忽略 IOException 但仍然打开串口。我不能用 try/catch 做到这一点,或者至少我不知道怎么做。

我想知道有没有办法尝试一些事情并以某种方式声明“我知道会抛出一个问题,这是一个安全问题,我选择忽略异常并继续执行任务”。需要明确的是,我不想忽略错误然后继续。我想忽略错误并仍然完成操作

以下是我最好的猜测,但它不起作用。

        try
        {
            serialPort1.Open();               
        }
        catch (System.IO.IOException)
        {
            MessageBox.Show("An IO Exception occurred.");
        }
        finally
        {          
            //SAFELY IGNORE ERROR AND DO TASK ANYWAY HERE
        }

如果有人可以帮助我解决这个问题,我将不胜感激。

编辑:如果我serialport1.Open之后添加代码,我会得到: IOException 截图

这与没有 try/catch 的情况基本相同。我想做的是说我正在尝试这样做:我不在乎它会引发错误,无论如何都要这样做。

4

3 回答 3

5

一般来说,如果您有一行代码导致异常,并且无论是否发生异常都需要完成额外的工作,您应该只使用 a catch,并将您想要完成的东西放在try/之外(之后) catch


对于您的特定情况(在您的其他问题中描述),您正在处理 .NET 的可怕破坏System.IO.Ports.SerialPort。打开串行端口成功,但这SerialPort.Open是一种复杂的方法,它会做很多额外的事情,并且如果任何额外(和不必要的)事情失败,就会坚持关闭端口。我还发现了其他问题System.IO.Ports.SerialPort(例如,无法通过其内部设备名称打开端口)。IMO,越早摆脱 System.IO.Ports.SerialPort越好。

您可以 p/invoke Win32 Serial Port 函数(CreateFile其余的都在这里)或找到已经编写了包装库的人(我做过,但它不公开)。

于 2013-02-21T23:22:13.780 回答
0

serialPort1.Open();

是什么引发了异常。通常,当您编写代码时,如果发生异常,您会清理连接。

正如其他人所提到的,如果您继续调用相同的方法,除非调用发生变化,否则您将不断收到异常。

所以理解这一点,我的建议是你寻找其他方法来打开串口,除了 serialPort1.Open(); 称呼。在 C# 中可能有也可能没有构建方式。所以你可能必须要有创意:)

于 2013-02-21T23:32:01.737 回答
0

SerialPort.Open

每个 SerialPort 对象只能存在一个打开的连接。任何应用程序的最佳做法是在调用 Close 方法后等待一段时间,然后再尝试调用 Open 方法,因为端口可能不会立即关闭。

端口处于无效状态。

  • 或者 -

设置底层端口状态的尝试失败。例如,从此 SerialPort 对象传递的参数无效。

我敢打赌这就是正在发生的事情......您的 SerialPort 最近打开了,现在您正试图在它准备好之前再次打开它。

我的建议是写一个循环,并在两次打开尝试之间睡一会儿。弄清楚你愿意在多长时间内尝试多少次。 break成功时退出循环。

foreach(int i in Enumerable.Range(1, numberOfAttempts)
{
  try
  {
    serialPort1.Open();
    break;
  }
  catch(Exception ex)
  {
    //log attempt #i failed because of ex
  }
  Thread.Sleep(millisecondsToWait);
}
于 2013-02-21T23:36:43.973 回答