处理串口对象

时间:2010-09-01 00:56:15

标签: c# .net serial-port

我正在编写一小段代码,用于确定计算机上哪些串口可以自由连接。这是通过循环不同的串行端口并调用Open()方法来完成的。如果发生异常,则表示该端口不可用。

然而,视觉工作室告诉我,如果我将dispose方法放在finally块中,我没有正确处理该对象,或者处理它太多次。 处理串口对象的最佳方法是什么,在for中创建一个新的串口对象或保留它是如何明智的呢?

带有问号的评论部分是我不确定的部分。

    public static void QueryOpenPorts(out string[] portNames, out bool[] isOpen)
    {
         // serial port object used to query
        SerialPort serialPort = new SerialPort();
        // get valid ports on current computer
        portNames = SerialPort.GetPortNames();
        // number of valid ports
        int count = portNames.Length;
        // initialise isOpen array
        isOpen = new bool[count];

        // iterate through portNames and check Open()
        for (int i = 0; i < count; i++)
        {
            // set port name
            serialPort.PortName = portNames[i];
            // attempt to open port
            try
            {
                serialPort.Open();
                // port available
                isOpen[i] = true;
            }
            catch (Exception ex)
            {
                // serial port exception
                if (ex is InvalidOperationException || ex is UnauthorizedAccessException || ex is IOException)
                {
                    // port unavailable
                    isOpen[i] = false;
                }
            }
            finally
            {

                //    // close serial port if opened successfully ????????????
                //    if (serialPort.IsOpen)
                //    {
                //        serialPort.Close();
                //    }

            }
        }
        // release object ?????????
        // serialPort.Dispose(); 
    } 

3 个答案:

答案 0 :(得分:3)

您可以使用using块来代替。

using (SerialPort serialPort = new SerialPort(portNames[i]))
{
    try
    {
        serialPort.Open();
        isOpen[i] = true;
        // You could call serialPort.Close() here if you want. It's really not needed, though, since the using block will dispose for you (which in turn will close)
    }
    // This is a better way to handle the exceptions.
    // You don't need to set isOpen[i] = false, since it defaults to that value
    catch (InvalidOperationException) { }
    catch (UnauthorizedAccessException) { }
    catch (IOException) { }
}

请注意,您无需致电Close(),因为Dispose()会为您执行此操作。

答案 1 :(得分:0)

我会在try中声明SerialPort(在for循环中)并在其上使用using()语句。您希望为要访问的每个端口使用不同的SerialPort实例。

答案 2 :(得分:0)

你不需要在循环中声明serialport,但你需要在那里重新实例化(即新的SerialPort())

这里有另一个例子:

http://www.gamedev.net/community/forums/topic.asp?topic_id=525884