如果端口已在Mono中打开,则C#SerialPort.Open()不会引发异常

时间:2011-05-10 00:44:07

标签: c# mono serial-port

我发现在Ubuntu上Windows和Mono之间的SerialPort.Open()实现有所不同。这是我目前的实施:

        if (serPort.IsOpen)
        {
            serPort.Close();
        }

        serPort.BaudRate = Convert.ToInt32(baudRateCmbBox.Text);
        serPort.PortName = serPortCmbBox.Text;

        try
        {
            serPort.Open();
        }
        catch
        {
            return false;
        }

        return true;

在Windows中,如果我打开了另一个打开相同串口的程序,则抛出异常并返回false。但是,在Mono中,无论另一个程序是否已打开串行端口,串行端口仍会打开。它甚至可以与其他程序同时读写串行端口。

所以问题是,有没有一种方法可以在Windows和Mono中工作,这将允许我检查另一个程序是否已经打开串口?

1 个答案:

答案 0 :(得分:2)

在POSIX中,这种行为是由于不同的文件锁定语义:许多进程可以访问同一个文件。如果您在Windows上的Mono上运行代码,您将看到与Microsoft .Net显示的行为相同的行为。

要在Linux上以相同的方式工作,Mono本机助手中的open_serial()方法必须在打开的文件描述符上获取flock()