Поделиться через


SerialPort Класс

Определение

Представляет ресурс последовательного порта.

public ref class SerialPort : System::ComponentModel::Component
public class SerialPort : System.ComponentModel.Component
type SerialPort = class
    inherit Component
Public Class SerialPort
Inherits Component
Наследование

Примеры

В следующем примере кода показано использование класса, позволяющего SerialPort двум пользователям общаться с двух отдельных компьютеров, подключенных с помощью кабеля модема NULL. В этом примере пользователям предлагается задать параметры порта и имя пользователя перед чатом. Оба компьютера должны выполнять программу для достижения полной функциональности этого примера.

// Use this code inside a project created with the Visual C# > Windows Desktop > Console Application template.
// Replace the code in Program.cs with this code.

using System;
using System.IO.Ports;
using System.Threading;

public class PortChat
{
    static bool _continue;
    static SerialPort _serialPort;

    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) { }
        }
    }

    // Display Port values and prompt user to enter a port.
    public static string SetPortName(string defaultPortName)
    {
        string portName;

        Console.WriteLine("Available Ports:");
        foreach (string s in SerialPort.GetPortNames())
        {
            Console.WriteLine("   {0}", s);
        }

        Console.Write("Enter COM port value (Default: {0}): ", defaultPortName);
        portName = Console.ReadLine();

        if (portName == "" || !(portName.ToLower()).StartsWith("com"))
        {
            portName = defaultPortName;
        }
        return portName;
    }
    // Display BaudRate values and prompt user to enter a value.
    public static int SetPortBaudRate(int defaultPortBaudRate)
    {
        string baudRate;

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

        if (baudRate == "")
        {
            baudRate = defaultPortBaudRate.ToString();
        }

        return int.Parse(baudRate);
    }

    // Display PortParity values and prompt user to enter a value.
    public static Parity SetPortParity(Parity defaultPortParity)
    {
        string parity;

        Console.WriteLine("Available Parity options:");
        foreach (string s in Enum.GetNames(typeof(Parity)))
        {
            Console.WriteLine("   {0}", s);
        }

        Console.Write("Enter Parity value (Default: {0}):", defaultPortParity.ToString(), true);
        parity = Console.ReadLine();

        if (parity == "")
        {
            parity = defaultPortParity.ToString();
        }

        return (Parity)Enum.Parse(typeof(Parity), parity, true);
    }
    // Display DataBits values and prompt user to enter a value.
    public static int SetPortDataBits(int defaultPortDataBits)
    {
        string dataBits;

        Console.Write("Enter DataBits value (Default: {0}): ", defaultPortDataBits);
        dataBits = Console.ReadLine();

        if (dataBits == "")
        {
            dataBits = defaultPortDataBits.ToString();
        }

        return int.Parse(dataBits.ToUpperInvariant());
    }

    // Display StopBits values and prompt user to enter a value.
    public static StopBits SetPortStopBits(StopBits defaultPortStopBits)
    {
        string stopBits;

        Console.WriteLine("Available StopBits options:");
        foreach (string s in Enum.GetNames(typeof(StopBits)))
        {
            Console.WriteLine("   {0}", s);
        }

        Console.Write("Enter StopBits value (None is not supported and \n" +
         "raises an ArgumentOutOfRangeException. \n (Default: {0}):", defaultPortStopBits.ToString());
        stopBits = Console.ReadLine();

        if (stopBits == "" )
        {
            stopBits = defaultPortStopBits.ToString();
        }

        return (StopBits)Enum.Parse(typeof(StopBits), stopBits, true);
    }
    public static Handshake SetPortHandshake(Handshake defaultPortHandshake)
    {
        string handshake;

        Console.WriteLine("Available Handshake options:");
        foreach (string s in Enum.GetNames(typeof(Handshake)))
        {
            Console.WriteLine("   {0}", s);
        }

        Console.Write("Enter Handshake value (Default: {0}):", defaultPortHandshake.ToString());
        handshake = Console.ReadLine();

        if (handshake == "")
        {
            handshake = defaultPortHandshake.ToString();
        }

        return (Handshake)Enum.Parse(typeof(Handshake), handshake, true);
    }
}
' Use this code inside a project created with the Visual Basic > Windows Desktop > Console Application template.
' Replace the default code in Module1.vb with this code. Then right click the project in Solution Explorer,
' select Properties, and set the Startup Object to PortChat.

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 stringComparer__1 As StringComparer = StringComparer.OrdinalIgnoreCase
        Dim readThread As 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 stringComparer__1.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 generatedExceptionName As TimeoutException
            End Try
        End While
    End Sub

    ' Display Port values and prompt user to enter a port.
    Public Shared Function SetPortName(defaultPortName As String) As String
        Dim portName As String

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

        Console.Write("Enter COM port value (Default: {0}): ", defaultPortName)
        portName = Console.ReadLine()

        If portName = "" OrElse Not (portName.ToLower()).StartsWith("com") Then
            portName = defaultPortName
        End If
        Return portName
    End Function
    ' Display BaudRate values and prompt user to enter a value.
    Public Shared Function SetPortBaudRate(defaultPortBaudRate As Integer) As Integer
        Dim baudRate As String

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

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

        Return Integer.Parse(baudRate)
    End Function

    ' Display PortParity values and prompt user to enter a value.
    Public Shared Function SetPortParity(defaultPortParity As Parity) As Parity
        Dim parity As String

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

        Console.Write("Enter Parity value (Default: {0}):", defaultPortParity.ToString(), True)
        parity = Console.ReadLine()

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

        Return CType([Enum].Parse(GetType(Parity), parity, True), Parity)
    End Function
    ' Display DataBits values and prompt user to enter a value.
    Public Shared Function SetPortDataBits(defaultPortDataBits As Integer) As Integer
        Dim dataBits As String

        Console.Write("Enter DataBits value (Default: {0}): ", defaultPortDataBits)
        dataBits = Console.ReadLine()

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

        Return Integer.Parse(dataBits.ToUpperInvariant())
    End Function
    ' Display StopBits values and prompt user to enter a value.

    Public Shared Function SetPortStopBits(defaultPortStopBits As StopBits) As StopBits
        Dim stopBits As String

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

        Console.Write("Enter StopBits value (None is not supported and " &
                      vbLf & "raises an ArgumentOutOfRangeException. " &
                      vbLf & " (Default: {0}):", defaultPortStopBits.ToString())
        stopBits = Console.ReadLine()

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

        Return CType([Enum].Parse(GetType(StopBits), stopBits, True), StopBits)
    End Function
    Public Shared Function SetPortHandshake(defaultPortHandshake As Handshake) As Handshake
        Dim handshake As String

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

        Console.Write("Enter Handshake value (Default: {0}):", defaultPortHandshake.ToString())
        handshake = Console.ReadLine()

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

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

Комментарии

Используйте этот класс для управления ресурсом файла последовательного порта. Этот класс обеспечивает синхронный и управляемый событиями операции ввода-вывода, доступ к состояниям закрепления и разрыва и доступ к свойствам последовательного драйвера. Кроме того, функциональные возможности этого класса можно упаковать в внутренний Stream объект, доступный через BaseStream свойство, и передать в классы, которые упаковывают или используют потоки.

Класс SerialPort поддерживает следующие кодировки: ASCIIEncoding, UTF8Encoding, UnicodeEncodingUTF32Encodingи любая кодировка, определенная в mscorlib.dll где кодовая страница меньше 50000 или кодовая страница составляет 54936. Вы можете использовать альтернативные кодировки, но необходимо использовать ReadByte или Write метод и самостоятельно выполнить кодировку.

Метод используется GetPortNames для получения допустимых портов для текущего компьютера.

SerialPort Если объект блокируется во время операции чтения, не прерывайте поток. Вместо этого закройте базовый поток или удалите SerialPort объект.

Конструкторы

Имя Описание
SerialPort()

Инициализирует новый экземпляр класса SerialPort.

SerialPort(IContainer)

Инициализирует новый экземпляр класса с помощью указанного SerialPortIContainer объекта.

SerialPort(String, Int32, Parity, Int32, StopBits)

Инициализирует новый экземпляр класса с помощью указанного SerialPort имени порта, скорости четности, бита четности, битов данных и остановки бита.

SerialPort(String, Int32, Parity, Int32)

Инициализирует новый экземпляр класса с помощью указанного SerialPort имени порта, скорости baud, бита четности и битов данных.

SerialPort(String, Int32, Parity)

Инициализирует новый экземпляр класса с помощью указанного SerialPort имени порта, скорости четности и бита четности.

SerialPort(String, Int32)

Инициализирует новый экземпляр класса с помощью указанного SerialPort имени порта и скорости baud.

SerialPort(String)

Инициализирует новый экземпляр класса с помощью указанного SerialPort имени порта.

Поля

Имя Описание
InfiniteTimeout

Указывает, что время ожидания не должно происходить.

Свойства

Имя Описание
BaseStream

Возвращает базовый Stream объект для SerialPort объекта.

BaudRate

Возвращает или задает последовательную частоту baud.

BreakState

Возвращает или задает состояние сигнала останова.

BytesToRead

Возвращает количество байтов данных в буфере получения.

BytesToWrite

Возвращает количество байтов данных в буфере отправки.

CanRaiseEvents

Возвращает значение, указывающее, может ли компонент вызвать событие.

(Унаследовано от Component)
CDHolding

Возвращает состояние строки "Обнаружение оператора" для порта.

Container

Возвращает объект IContainer , содержащий Componentобъект .

(Унаследовано от Component)
CtsHolding

Возвращает состояние строки Clear-to-Send.

DataBits

Возвращает или задает стандартную длину битов данных на байт.

DesignMode

Возвращает значение, указывающее, находится ли текущий Component режим разработки.

(Унаследовано от Component)
DiscardNull

Возвращает или задает значение, указывающее, игнорируются ли байты NULL при передаче между портом и буфером получения.

DsrHolding

Возвращает состояние сигнала "Готово к набору данных" (DSR).

DtrEnable

Возвращает или задает значение, которое позволяет сигналу "Готово к использованию терминала данных" (DTR) во время последовательного взаимодействия.

Encoding

Получает или задает кодировку байтов для преобразования текста до и после передачи.

Events

Возвращает список обработчиков событий, подключенных к этому Component.

(Унаследовано от Component)
Handshake

Возвращает или задает протокол подтверждения для последовательной передачи данных через порт с помощью значения.Handshake

IsOpen

Возвращает значение, указывающее состояние открытого или закрытого SerialPort объекта.

NewLine

Возвращает или задает значение, используемое для интерпретации конца вызова ReadLine() и WriteLine(String) методов.

Parity

Возвращает или задает протокол проверки четности.

ParityReplace

Возвращает или задает байт, который заменяет недопустимые байты в потоке данных при возникновении ошибки четности.

PortName

Возвращает или задает порт для обмена данными, включая не только все доступные COM-порты.

ReadBufferSize

Возвращает или задает размер входного буфера SerialPort .

ReadTimeout

Возвращает или задает количество миллисекунда до истечения времени ожидания, когда операция чтения не завершается.

ReceivedBytesThreshold

Возвращает или задает количество байтов во внутреннем входном буфере перед событием DataReceived .

RtsEnable

Возвращает или задает значение, указывающее, включен ли сигнал запроса на отправку (RTS) во время последовательного взаимодействия.

Site

Возвращает или задает ISite объект Component.

(Унаследовано от Component)
StopBits

Возвращает или задает стандартное число стоп-битов на байт.

WriteBufferSize

Возвращает или задает размер выходного буфера вывода последовательного порта.

WriteTimeout

Возвращает или задает количество миллисекунда до истечения времени ожидания, когда операция записи не завершается.

Методы

Имя Описание
Close()

Закрывает подключение к порту, задает IsOpen для свойства falseзначение и удаляет внутренний Stream объект.

CreateObjRef(Type)

Создает объект, содержащий все соответствующие сведения, необходимые для создания прокси-сервера, используемого для взаимодействия с удаленным объектом.

(Унаследовано от MarshalByRefObject)
DiscardInBuffer()

Удаляет данные из буфера получения последовательного драйвера.

DiscardOutBuffer()

Удаляет данные из буфера передачи последовательного драйвера.

Dispose()

Освобождает все ресурсы, используемые параметром Component.

(Унаследовано от Component)
Dispose(Boolean)

Освобождает неуправляемые ресурсы, используемые SerialPort и при необходимости освобождает управляемые ресурсы.

Equals(Object)

Определяет, равен ли указанный объект текущему объекту.

(Унаследовано от Object)
GetHashCode()

Служит хэш-функцией по умолчанию.

(Унаследовано от Object)
GetLifetimeService()
Устаревшие..

Извлекает текущий объект службы времени существования, который управляет политикой времени существования для этого экземпляра.

(Унаследовано от MarshalByRefObject)
GetPortNames()

Возвращает массив имен последовательных портов для текущего компьютера.

GetService(Type)

Возвращает объект, представляющий службу, предоставляемую Component или ее Container.

(Унаследовано от Component)
GetType()

Возвращает Type текущего экземпляра.

(Унаследовано от Object)
InitializeLifetimeService()
Устаревшие..

Получает объект службы времени существования для управления политикой времени существования для этого экземпляра.

(Унаследовано от MarshalByRefObject)
MemberwiseClone()

Создает неглубокую копию текущей Object.

(Унаследовано от Object)
MemberwiseClone(Boolean)

Создает неглубокую копию текущего MarshalByRefObject объекта.

(Унаследовано от MarshalByRefObject)
Open()

Открывает новое подключение последовательного порта.

Read(Byte[], Int32, Int32)

Считывает количество байтов из входного SerialPort буфера и записывает эти байты в массив байтов по указанному смещение.

Read(Char[], Int32, Int32)

Считывает ряд символов из SerialPort входного буфера и записывает их в массив символов с заданным смещением.

ReadByte()

Синхронно считывает один байт из входного буфера SerialPort .

ReadChar()

Синхронно считывает один символ из входного буфера SerialPort .

ReadExisting()

Считывает все сразу доступные байты на основе кодирования как в потоке, так и в входном буфере SerialPort объекта.

ReadLine()

Считывает значение NewLine в входном буфере.

ReadTo(String)

Считывает строку до указанного value в входном буфере.

ToString()

String Возвращает имя, содержащее имя , если таковое Componentимеется. Этот метод не должен быть переопределен.

(Унаследовано от Component)
Write(Byte[], Int32, Int32)

Записывает указанное число байтов в последовательный порт с помощью данных из буфера.

Write(Char[], Int32, Int32)

Записывает указанное число символов в последовательный порт с помощью данных из буфера.

Write(String)

Записывает указанную строку в последовательный порт.

WriteLine(String)

Записывает указанную строку и NewLine значение в выходной буфер.

События

Имя Описание
DataReceived

Указывает, что данные были получены через порт, SerialPort представленный объектом.

Disposed

Происходит при удалении компонента вызовом Dispose() метода.

(Унаследовано от Component)
ErrorReceived

Указывает, что произошла ошибка с портом, SerialPort представленным объектом.

PinChanged

Указывает, что событие сигнала, отличное от данных, произошло на порту, представленном SerialPort объектом.

Применяется к