C# SerialPort 類

SerialPort 類


表示串行端口資源

繼承層次結構

--------------------------------------------------------------------------------


System.Object
  System.MarshalByRefObject
    System.ComponentModel.Component
      System.IO.Ports.SerialPort

 

命名空間: System.IO.Ports
程序集: System(在 System.dll 中)


語法

--------------------------------------------------------------------------------

C#

public class SerialPort : Component
 
SerialPort 類型公開以下成員。

 

構造函數

--------------------------------------------------------------------------------
名稱

說明

 

 

SerialPort()

初始化 SerialPort 類的新實例。


SerialPort(IContainer)

使用指定的 IContainer 對象初始化 SerialPort 類的新實例。


SerialPort(String)

使用指定的端口名稱初始化 SerialPort 類的新實例。

 

SerialPort(String, Int32)

使用指定的端口名稱和波特率初始化 SerialPort 類的新實例。

 

SerialPort(String, Int32, Parity)

使用指定的端口名稱、波特率和奇偶校驗位初始化 SerialPort 類的新實例。

 

SerialPort(String, Int32, Parity, Int32)

使用指定的端口名稱、波特率、校驗位和數據位初始化 SerialPort 類的新實例。

 

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

使用指定的端口名稱、波特率、奇偶校驗位、數據位和停止位初始化 SerialPort 類的新實例。


屬性

--------------------------------------------------------------------------------


名稱  說明

  

BaseStream

獲取 SerialPort 對象的基礎 Stream 對象。


BaudRate

獲取或設置串行波特率。

 
BreakState

 獲取或設置中斷信號狀態。

  

BytesToRead

獲取接收緩衝區中數據的字節數。

  

BytesToWrite

 獲取發送緩衝區中數據的字節數。

  

CanRaiseEvents

 獲取一個指示組件是否可以引發事件的值。
(繼承自 Component。)

  

CDHolding

獲取端口的載波檢測行的狀態。


Container

獲取 IContainer,它包含 Component。
(繼承自 Component。)

 

CtsHolding

 獲取“可以發送”行的狀態。


DataBits

獲取或設置每個字節的標準數據位長度。

 

DesignMode

獲取一個值,用以指示 Component 當前是否處於設計模式。 (繼承自 Component。)

 

DiscardNull

獲取或設置一個值,該值指示 Null 字節在端口和接收緩衝區之間傳輸時是否被忽略。

  

DsrHolding

 獲取數據設置就緒 (DSR) 信號的狀態。

 

 DtrEnable

獲取或設置一個值,該值在串行通信過程中啓用數據終端就緒 (DTR) 信號。

 

 Encoding

取或設置傳輸前後文本轉換的字節編碼。

 

 Events

獲取附加到此 Component 的事件處理程序的列表。 (繼承自 Component。)

 

 Handshake

獲取或設置串行端口數據傳輸的握手協議。

 

 IsOpen

獲取一個值,該值指示 SerialPort 對象的打開或關閉狀態。

 

 NewLine

獲取或設置用於解釋 ReadLine 和 WriteLine 方法調用結束的值。

 

 Parity

獲取或設置奇偶校驗檢查協議。

 

 ParityReplace

獲取或設置一個字節,該字節在發生奇偶校驗錯誤時替換數據流中的無效字節。

 

 PortName

獲取或設置通信端口,包括但不限於所有可用的 COM 端口。

 

 ReadBufferSize

獲取或設置 SerialPort 輸入緩衝區的大小。

 

 ReadTimeout 獲取或設置讀取操作未完成時發生超時之前的毫秒數。

 

 ReceivedBytesThreshold

獲取或設置 DataReceived 事件發生前內部輸入緩衝區中的字節數。

 

 RtsEnable

獲取或設置一個值,該值指示在串行通信中是否啓用請求發送 (RTS) 信號。

 

 Site

獲取或設置 Component 的 ISite。 (繼承自 Component。)

 

 StopBits

獲取或設置每個字節的標準停止位數。

 

 WriteBufferSize

獲取或設置串行端口輸出緩衝區的大小。

 WriteTimeout

 獲取或設置寫入操作未完成時發生超時之前的毫秒數。


方法

--------------------------------------------------------------------------------

名稱 說明

  

Close

關閉端口連接,將 IsOpen 屬性設置爲 false,並釋放內部 Stream 對象。

 

CreateObjRef

 創建一個對象,該對象包含生成用於與遠程對象進行通信的代理所需的全部相關信息。 (繼承自 MarshalByRefObject。)

 

DiscardInBuffer

丟棄來自串行驅動程序的接收緩衝區的數據。

 

DiscardOutBuffer

 棄來自串行驅動程序的傳輸緩衝區的數據。

 

Dispose()

放由 Component 使用的所有資源。 (繼承自 Component。)

 

Dispose(Boolean)

放由 SerialPort 佔用的非託管資源,還可以另外再釋放託管資源。 (重寫 Component.Dispose(Boolean)。)

 

Equals(Object)

定指定的對象是否等於當前對象。 (繼承自 Object。)

 

Finalize

通過垃圾回收將 Component 回收之前,釋放非託管資源並執行其他清理操作。 (繼承自 Component。)

 

GetHashCode

作特定類型的哈希函數。 (繼承自 Object。)

 

GetLifetimeService

索控制此實例的生存期策略的當前生存期服務對象。 (繼承自 MarshalByRefObject。)

 

GetPortNames

取當前計算機的串行端口名稱數組。

 

GetService

回一個對象,該對象表示由 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

直讀取到輸入緩衝區中的指定 value 的字符串。

 

ToString

返回包含 Component 的名稱的 String(如果有)。不應重寫此方法。 (繼承自 Component。)

 

Write(String)

將指定的字符串寫入串行端口。

 

Write(Byte[], Int32, Int32)

用緩衝區的數據將指定數量的字節寫入串行端口。

 

Write(Char[], Int32, Int32)

 用緩衝區的數據將指定數量的字符寫入串行端口。

 

WriteLine

指定的字符串和 NewLine 值寫入輸出緩衝區。


事件

--------------------------------------------------------------------------------

名稱 說明

  

DataReceived

表示將處理 SerialPort 對象的數據接收事件的方法。

  

Disposed

當通過調用 Dispose 方法釋放組件時發生。 (繼承自 Component。)

 

ErrorReceived

表示處理 SerialPort 對象的錯誤事件的方法。

 

PinChanged

表示將處理 SerialPort 對象的串行管腳更改事件的方法。


字段

--------------------------------------------------------------------------------

名稱 說明

 

InfiniteTimeout

指示不應該發生超時。


備註

--------------------------------------------------------------------------------

 

此類用於控制串行端口文件資源。此類提供同步 I/O 和事件驅動的 I/O、對管腳和中斷狀態的訪問以及對串行驅動程序屬性的訪問。另外,此類的功能可以包裝在內部 Stream 對象中,可通過 BaseStream 屬性訪問,並且可以傳遞給包裝或使用流的類。

SerialPort 類支持以下編碼:ASCIIEncoding、UTF8Encoding、UnicodeEncoding、UTF32Encoding,以及 mscorlib.dll 中定義的、代碼頁小於 50000 或者爲 54936 的所有編碼。可以使用備用編碼,但必須使用 ReadByte 或 Write 方法並自己執行編碼。

使用 GetPortNames 方法檢索當前計算機的有效的端口。

如果 SerialPort 對象被阻止在一次讀取操作時,不要中止線程。相反,或者關閉基礎流或進程 SerialPort 對象。

 

示例

--------------------------------------------------------------------------------

 

下面的代碼示例演示如何使用 SerialPort 類以允許兩位用戶分別在兩臺通過 NULL 調制解調器電纜連接的獨立計算機上聊天。本示例中,在聊天之前將提示用戶輸入端口設置和用戶名。這兩臺計算機必須同時執行該程序才能實現本示例的全部功能。


C#

 

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

    public static string SetPortName(string defaultPortName)
    {
        string portName;

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

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

        if (portName == "")
        {
            portName = defaultPortName;
        }
        return portName;
    }

    public static int SetPortBaudRate(int defaultPortBaudRate)
    {
        string baudRate;

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

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

        return int.Parse(baudRate);
    }

    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("Parity({0}):", defaultPortParity.ToString());
        parity = Console.ReadLine();

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

        return (Parity)Enum.Parse(typeof(Parity), parity);
    }

    public static int SetPortDataBits(int defaultPortDataBits)
    {
        string dataBits;

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

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

        return int.Parse(dataBits);
    }

    public static StopBits SetPortStopBits(StopBits defaultPortStopBits)
    {
        string stopBits;

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

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

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

        return (StopBits)Enum.Parse(typeof(StopBits), stopBits);
    }

    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("Handshake({0}):", defaultPortHandshake.ToString());
        handshake = Console.ReadLine();

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

        return (Handshake)Enum.Parse(typeof(Handshake), handshake);
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章