SerialPort Class
This page is specific to:.NET Framework Version:2.03.03.54.0
.NET Framework Class Library
SerialPort Class

Represents a serial port resource.

Namespace:  System.IO.Ports
Assembly:  System (in System.dll)
Syntax

'Usage

Dim instance As SerialPort

'Declaration

Public Class SerialPort _
    Inherits Component
Remarks

Use this class to control a serial port file resource. This class provides synchronous and event-driven I/O, access to pin and break states, and access to serial driver properties. Additionally, the functionality of this class can be wrapped in an internal Stream object, accessible through the BaseStream property, and passed to classes that wrap or use streams.

The SerialPort class supports the following encodings: ASCIIEncoding, UTF8Encoding, UnicodeEncoding, UTF32Encoding, and any encoding defined in mscorlib.dll where the code page is less than 50000 or the code page is 54936. You can use alternate encodings, but you must use the ReadByte or Write method and perform the encoding yourself.

Examples

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. Both computers must be executing the program to achieve full functionality of this example.

Imports System
Imports System.IO.Ports
Imports System.Threading

Public Class PortChat
    Shared _continue As Boolean
    Shared _serialPort As SerialPort

    Public Shared Sub Main()
        Dim name As String
        Dim message As String
        Dim sComparer As StringComparer = StringComparer.OrdinalIgnoreCase
        Dim readThread As Thread = New Thread(AddressOf 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 sComparer.Equals("quit", message) Then
                _continue = False
            Else
                _serialPort.WriteLine( _
                    String.Format("<{0}>: {1}", name, message))
            End If
        end while

        readThread.Join()
        _serialPort.Close()
    End Sub

    Public Shared Sub Read()
        While (_continue)
            Try
                Dim message As String = _serialPort.ReadLine()
                Console.WriteLine(message)
            Catch ex As TimeoutException
                ' Do nothing
            End Try
        End While
    End Sub

    Public Shared Function SetPortName(ByVal defaultPortName As String) As String
        Dim newPortName As String

        Console.WriteLine("Available Ports:")
        Dim s As String
        For Each s In SerialPort.GetPortNames()
            Console.WriteLine("   {0}", s)
        Next s

        Console.Write("COM port({0}): ", defaultPortName)
        newPortName = Console.ReadLine()

        If newPortName = "" Then
            newPortName = defaultPortName
        End If
        Return newPortName
    End Function

    Public Shared Function SetPortBaudRate(ByVal defaultPortBaudRate As Integer) As Integer
        Dim newBaudRate As String

        Console.Write("Baud Rate({0}): ", defaultPortBaudRate)
        newBaudRate = Console.ReadLine()

        If newBaudRate = "" Then
            newBaudRate = defaultPortBaudRate.ToString()
        End If

        Return Integer.Parse(newBaudRate)
    End Function

    Public Shared Function SetPortParity(ByVal defaultPortParity As Parity) As Parity
        Dim newParity As String

        Console.WriteLine("Available Parity options:")
        Dim s As String
        For Each s In [Enum].GetNames(GetType(Parity))
            Console.WriteLine("   {0}", s)
        Next s

        Console.Write("Parity({0}):", defaultPortParity.ToString())
        newparity = Console.ReadLine()

        If newparity = "" Then
            newparity = defaultPortParity.ToString()
        End If

        Return CType([Enum].Parse(GetType(Parity), newParity), Parity)
    End Function

    Public Shared Function SetPortDataBits(ByVal defaultPortDataBits As Integer) As Integer
        Dim newDataBits As String

        Console.Write("Data Bits({0}): ", defaultPortDataBits)
        newDataBits = Console.ReadLine()

        If newDataBits = "" Then
            newDataBits = defaultPortDataBits.ToString()
        End If

        Return Integer.Parse(newDataBits)
    End Function

    Public Shared Function SetPortStopBits(ByVal defaultPortStopBits As StopBits) As StopBits
        Dim newStopBits As String

        Console.WriteLine("Available Stop Bits options:")
        Dim s As String
        For Each s In [Enum].GetNames(GetType(StopBits))
            Console.WriteLine("   {0}", s)
        Next s

        Console.Write("Stop Bits({0}):", defaultPortStopBits.ToString())
        newStopBits = Console.ReadLine()

        If newStopBits = "" Then
            newStopBits = defaultPortStopBits.ToString()
        End If

        Return CType([Enum].Parse(GetType(StopBits), newStopBits), StopBits)
    End Function

    Public Shared Function SetPortHandshake(ByVal defaultPortHandshake As Handshake) As Handshake
        Dim newHandshake As String

        Console.WriteLine("Available Handshake options:")
        Dim s As String
        For Each s In [Enum].GetNames(GetType(Handshake))
            Console.WriteLine("   {0}", s)
        Next s

        Console.Write("Stop Bits({0}):", defaultPortHandshake.ToString())
        newHandshake = Console.ReadLine()

        If newHandshake = "" Then
            newHandshake = defaultPortHandshake.ToString()
        End If

        Return CType([Enum].Parse(GetType(Handshake), newHandshake), Handshake)
    End Function
End Class


.NET Framework Security

Inheritance Hierarchy

System..::.Object
  System..::.MarshalByRefObject
    System.ComponentModel..::.Component
      System.IO.Ports..::.SerialPort
Thread Safety

Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.
Platforms

Windows 7, Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2008 R2, Windows Server 2008, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98, Windows CE, Windows Mobile for Smartphone, Windows Mobile for Pocket PC

The .NET Framework and .NET Compact Framework do not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.
Version Information

.NET Framework

Supported in: 3.5, 3.0, 2.0

.NET Compact Framework

Supported in: 3.5, 2.0
See Also

Reference

Community Content

Two threads accessing the serial port at the same time without locking?
Added by:Kurt H

Is this example thread safe? Shouldn't there be a lock object used to ensure that only either the read thread or the write thread use the serial port at the same time? Or is this generally safe to do without locking?

And shouldn't the read thread sit idle until some event like the DataReceived is triggered rather than a tight loop around ReadLine?

Typo in SetPortHandshake()
Added by:Anjdreas

I suppose the string "Stop Bits({0}):" in SetPortHandshake() is a typo as the method wants input for a handshake method and not stop bits.

This goes for both C# and Visual Basic examples.

Console.Write("Stop Bits({0}):", defaultPortHandshake.ToString());

Why is the Read method not a blocking method?
Added by:MrDotNetDude

internal void recieveMessage(ref Message message, int length)
{
lock (_serialPort)
{
// This method may return more message bytes than specified in the length.

int numberOfBytesRead = 0;
byte[] readBuffer = new byte[length];

numberOfBytesRead = _serialPort.Read(readBuffer, 0, length);

// Force a read (if any data exists) to clear the buffer of any garbage data
if (_serialPort.BytesToRead > 0)
{
_serialPort.ReadExisting();
}
// Parse the message
message = message.Parse(readBuffer);
}
}

SerialPort bug?
Added by:uniquegodwin
If you plug out the cable after connecting using serialport,there is a severe memory leakage problem.

Please email me to "uniquegodwin at gmail.com" if anyone has the solution.
Thanks.
SerialPort.Read returns zero, even when reading bytes
Added by:gm elektronik ag
I'm trying to read from the COM port using:

BytesRead = COM.Read(RXBuffer, BytesRead, BytesExpected - BytesRead)


But Im observing behaviour which is inconsistent with MSDN documentation. The read operation obviously completes successfully (RXBuffer indeed contains all the data that was expected), yet BytesRead remains at zero value.

Can anyone provide some insight, as to what I am doing wrong? please?
Serialport
Added by:Mihai T
I'm trying to read the serial port in Visual Basic using serialport1.readline function. It's really frustrating, since I can't get anything read back. If I use Hyperterm (copied in Vista from XP) I can see all the characters coming in. The connection is 9600baud, 7bits/char, odd parity, 2 stop bits. Am I missing something here, since it's obvious the problem is with Visual Basic 2008 express edition? Sending data is fine.

Mihai

Yes this example is thread safe w/o locking
Added by:prflanagan
Notice the serial port used in this example is static, which according to their documentation is thread-safe. If it was an instance locking would probably be required. Does anyone know the advantage of this looping thread approach vs. using a DataReceived event handler.
Read Buffer threshold Insane Delay
Added by:ruskey
Hey im streaming 32 characters of information from my Atmega324 and in hyperterminal changes in, say my encoders is updated immediately.

But when i use the system.io.ports (.net 2 serial) i get atleast 6 seconds delay before i see a change!!!!!!! >> Im reading in buffer till i see new line and even after tinkering with timeouts, buffersizes and thresholds im still getting crazy lag!!!


Ive had to currently revert to using MSCOMM32.OCX to get nice and fast input from my serial. . . . <<This is what really confuses me. . how does an older implementation work so much better???

PLEASE HELP!!!!
© 2009 Microsoft Corporation. All rights reserved.   Terms of Use | Trademarks | Privacy Statement
Page view tracker
Rate the Lightweight library
x
Lightweight builds on ScriptFree (loband) by adding features you've requested: a SearchBox and default code language selection.
Do you like the SearchBox?
Do you like the tabbed code blocks?
How useful is this topic?
Tell us more.
Thanks
x
You're helping to improve MSDN Online.
Feedback
Switch View
Classic
Lightweight Beta
ScriptFree
Switch View