-1

所以我有一个使用的 C# WinForm

SerialPort SerialPort1 = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
SerialPort1.Open()
SerialPort1.DataReceived += new SerialDataReceivedEventHandler(...)

监听由其他软件创建的几个虚拟 COM 端口(我无法控制它)

所以一般情况下它运行良好,除了当其他软件死掉或消失时,它创建的虚拟 COM 端口也消失或丢失

所以我的 WinForm App 失败了,因为没有 COM1 可以听

问题:当没有COM端口可以监听时,我应该如何处理这个错误?

非常感谢你的回复

4

3 回答 3

1

把它放在一个 try-catch 语句中,如果发生了不好的事情,就会向用户打印一条消息。

try 
{
    SerialPort SerialPort1 = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
    SerialPort1.Open()
    SerialPort1.DataReceived += new SerialDataReceivedEventHandler(...)
}
catch(Exception e)
{
    //Print error to user
}

有关异常的更细粒度,请参阅此处的串行端口的 msdn 文档。

于 2014-07-25T15:44:07.143 回答
1

好吧,不,虚拟串行端口是由软件模拟的。如果该软件出现故障,那么当然就不再有功能性的串行端口了。除了找到更好的软件之外,您无能为力。

如果这是常见的故障模式,在程序与 USB 设备通信时拔出 USB 设备的连接器,那么就不要打扰了。任何人都需要学习使用 Windows“安全删除硬件”托盘图标选项的艰难方式选修的。要让他们意识到“不安全地删除硬件”的作用,往往需要一些强化。尽管奇怪的是,这样做的往往是程序员,很少是普通用户。可能是网站偏见,普通用户只是倾向于自己弄清楚这样做不是一个好主意。不是,这些司机指望人类合作。由于串口不是即插即用设备,因此驱动程序无法发送“设备已消失,停止使用”通知。好吧,除了故意使您的程序崩溃。

于 2014-07-25T16:13:14.053 回答
0

如果唯一的问题是端口的数量是不可预测的,您可以检测所有可用的端口,如下所示,然后一次尝试一个。当 USB 设备有时显示为 COM1 有时显示为 COM5 时,我曾经遇到过这个问题

 string[] availablePorts = SerialPort.GetPortNames();
        foreach (string strPortName in availablePorts)
        {
            try
            {
                SerialPort SerialPort1 = new SerialPort(strPortName, 9600, Parity.None, 8, StopBits.One);
                SerialPort1.Open();
            }
            catch (Exception e)
            {
                //Print error to user
            }
        }
于 2014-07-28T21:11:18.987 回答