This topic has not yet been rated - Rate this topic

SerialPort.Close Method

Updated: December 2010

Closes the port connection, sets the IsOpen property to false, and disposes of the internal Stream object.

Namespace:  System.IO.Ports
Assembly:  System (in System.dll)
public void Close()
Exception Condition
IOException

The port is in an invalid state.

- or -

An attempt to set the state of the underlying port failed. For example, the parameters passed from this SerialPort object were invalid.

Calling this method closes the SerialPort object and clears both the receive and transmit buffers. This method calls the Component.Dispose() method, which invokes the protected SerialPort.Dispose(Boolean) method with the disposing parameter set to true.

The best practice for any application is to wait for some amount of time after calling the Close method before attempting to call the Open method, as the port may not be closed instantly.

The following code example demonstrates the use of the SerialPort class to allow two users to chat from two separate computers connected by a null modem cable. In this example, the users are prompted for the port settings and a username before chatting. This code example is part of a larger code example provided for the SerialPort class.


public static void Main()
{
    string name;
    string message;
    StringComparer stringComparer = StringComparer.OrdinalIgnoreCase;
    Thread readThread = new Thread(Read);

    // Create a new SerialPort object with default settings.
    _serialPort = new SerialPort();

    // Allow the user to set the appropriate properties.
    _serialPort.PortName = SetPortName(_serialPort.PortName);
    _serialPort.BaudRate = SetPortBaudRate(_serialPort.BaudRate);
    _serialPort.Parity = SetPortParity(_serialPort.Parity);
    _serialPort.DataBits = SetPortDataBits(_serialPort.DataBits);
    _serialPort.StopBits = SetPortStopBits(_serialPort.StopBits);
    _serialPort.Handshake = SetPortHandshake(_serialPort.Handshake);

    // Set the read/write timeouts
    _serialPort.ReadTimeout = 500;
    _serialPort.WriteTimeout = 500;

    _serialPort.Open();
    _continue = true;
    readThread.Start();

    Console.Write("Name: ");
    name = Console.ReadLine();

    Console.WriteLine("Type QUIT to exit");

    while (_continue)
    {
        message = Console.ReadLine();

        if (stringComparer.Equals("quit", message))
        {
            _continue = false;
        }
        else
        {
            _serialPort.WriteLine(
                String.Format("<{0}>: {1}", name, message) );
        }
    }

    readThread.Join();
    _serialPort.Close();
}

public static void Read()
{
    while (_continue)
    {
        try
        {
            string message = _serialPort.ReadLine();
            Console.WriteLine(message);
        }
        catch (TimeoutException) { }
    }
}


.NET Framework

Supported in: 4, 3.5, 3.0, 2.0

.NET Framework Client Profile

Supported in: 4, 3.5 SP1

Windows 7, Windows Vista SP1 or later, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008 (Server Core not supported), Windows Server 2008 R2 (Server Core supported with SP1 or later), Windows Server 2003 SP2

The .NET Framework does not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.

Date

History

Reason

December 2010

Added IOException and information about Dispose.

Information enhancement.

Did you find this helpful?
(1500 characters remaining)
Community Content Add
Annotations FAQ
I Would Also Like a Better Sense of How Long "Some Time" is Before Reopening the Port
I've been trying to upgrade some code from the VB6 serial port control to the one in .NET 4.  It appears that the serial port isn't raising the event I'm expecting when data come in on the serial port.  I'm wondering whether the problem is not waiting long enough after the port is closed before re-opening it on a different serial port number.  Alas, I have no sense of how long I should wait after a close prior to the next open.  Sure would appreciate clarification.

Regards,
Jerry
So, Close() is asynchronous ?

Yet there is no description on how to find out when the Close() finally completes.
Is there any definitive mechanism for me to know when the port is closed and ready for the next Open() ?

Paul