我发现在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中工作,这将允许我检查另一个程序是否已经打开串口?
答案 0 :(得分:2)
在POSIX中,这种行为是由于不同的文件锁定语义:许多进程可以访问同一个文件。如果您在Windows上的Mono上运行代码,您将看到与Microsoft .Net显示的行为相同的行为。
要在Linux上以相同的方式工作,Mono本机助手中的open_serial()方法必须在打开的文件描述符上获取flock()。