当前位置:  开发笔记 > 编程语言 > 正文

C#检查COM(串行)端口是否已打开

如何解决《C#检查COM(串行)端口是否已打开》经验,为你挑选了2个好方法。

是否有一种简单的方法可以以编程方式检查串行COM端口是否已打开/正在使用?

通常我会用:

try
{
    // open port
}
catch (Exception ex)
{
    // handle the exception
}

但是,我想以编程方式检查,以便我可以尝试使用另一个COM端口或其他类似的端口.



1> Fionn..:

我不久前需要类似的东西来搜索设备.

我获得了一个可用的COM端口列表,然后简单地迭代它们,如果它没有抛出异常,我试图与设备通信.有点粗糙但有效.

var portNames = SerialPort.GetPortNames();

foreach(var port in portNames) {
    //Try for every portName and break on the first working
}


我真的希望有一个更"优雅"的解决方案......但是当其他所有方法都失败时"使用任何可能的方法来使程序工作"!

2> Jeff..:

我就这样做了:

      [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    internal static extern SafeFileHandle CreateFile(string lpFileName, int dwDesiredAccess, int dwShareMode, IntPtr securityAttrs, int dwCreationDisposition, int dwFlagsAndAttributes, IntPtr hTemplateFile);

然后是

        int dwFlagsAndAttributes = 0x40000000;

        var portName = "COM5";

        var isValid = SerialPort.GetPortNames().Any(x => string.Compare(x, portName, true) == 0);
        if (!isValid)
            throw new System.IO.IOException(string.Format("{0} port was not found", portName));

        //Borrowed from Microsoft's Serial Port Open Method :)
        SafeFileHandle hFile = CreateFile(@"\\.\" + portName, -1073741824, 0, IntPtr.Zero, 3, dwFlagsAndAttributes, IntPtr.Zero);
        if (hFile.IsInvalid)
            throw new System.IO.IOException(string.Format("{0} port is already open", portName));

        hFile.Close();


        using (var serialPort = new SerialPort(portName, 115200, Parity.None, 8, StopBits.One))
        {
            serialPort.Open();
        }


因为您不希望例外来控制应用程序的流程.它更干净,试图处理前面的问题,而不是抛出异常而不是处理它.
@Jeff:但是,如果有人在您检查和打开串口之间打开串口,您的程序将会爆炸.通过使用例外,您可以避免潜在的灾难.
推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有