我发现 SerialPort.Open() 在 Windows 和 Ubuntu 上的 Mono 之间的实现有所不同。这是我当前的实现:
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 中工作,让我可以检查另一个程序是否已经打开了串口?
最佳答案
在 POSIX 中,这种行为是由于不同的文件锁定语义:许多进程可以访问同一个文件。如果您在 Windows 上的 Mono 上运行您的代码,您会看到与 Microsoft .Net 所显示的相同的行为。
要在 Linux 上以相同的方式工作,open_serial() Mono native 助手中的方法必须获取 flock()在打开的文件描述符上。
关于如果端口已在 Mono 中打开,C# SerialPort.Open() 不会抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5944004/