《C#串口編程系列文章》
(1)預備知識
(2)介紹SerialPort類的API
(3)使用SerialPort進行C#串口編程的常見bug點
(4)深入探究關閉串口時Winform界面卡死原因
(5)項目實戰-串口編程代碼示例
(6)RS232,RS485,串口,三個名詞的聯系與區別
(7)詳解串口通信協議
獲取PC上所有的串口名
public static string[] GetPortNames();
構造函數(設置串口參數)
public SerialPort(string portName, int baudRate, Parity parity, int dataBits, StopBits stopBits);
判斷串口打開/關閉
public bool IsOpen { get; }
打開串口
public void Open();
關閉串口
public void Close();
發送數據
public void Write(byte[] buffer, int offset, int count);
public void Write(string text);
public void Write(char[] buffer, int offset, int count);
public void WriteLine(string text);
讀取數據
public int Read(byte[] buffer, int offset, int count);
public string ReadExisting();
public int Read(char[] buffer, int offset, int count);
public int ReadByte();
public int ReadChar();
public string ReadLine();
編碼方式
public Encoding Encoding { get; set; }
此屬性,決定ReadExisting,ReadChar,Write(string text),Write(char[] buffer, int offset, int count)采用的編碼方式。
行結束符
public string NewLine { get; set; }
此屬性決定ReadLine和WriteLine方法使用的換行符。
超時設置
public int ReadTimeout { get; set; }
public int WriteTimeout { get; set; }
當我們調用讀或寫方法,如果在指定的超時時間內沒有從接收緩存讀到數據或者將數據發送到發送緩存,那么讀寫方法就會拋出超時異常。
串口收到數據觸發的事件
public event SerialDataReceivedEventHandler DataReceived;
接收到多少字節觸發一次DataReceived事件
public int ReceivedBytesThreshold { get; set; }
清空接收和發送緩存
public void DiscardInBuffer();
public void DiscardOutBuffer();
其他極其不重要的屬性(哈哈😄)
public bool DtrEnable { get; set; }
public bool RtsEnable { get; set; }
public bool CtsHolding { get; }
public bool DsrHolding { get; }
public Handshake Handshake { get; set; }
這5個屬性在串口編程中幾乎永遠用不到,但我們解釋下這5個屬性,可以選擇不看。
上世紀串口實現使用了RxD,TxD兩根數據收發線,一根地線,若干根控制線。隨着IT技術的日新月異,現在幾乎不再使用控制線。而上述的5個屬性正是對控制線的抽象,所以這些屬性也用不到了,這些屬性的默認值一般都是false,None,即禁用,不使用的含義,所以在串口編程中不理這些屬性就OK了。
當然,你可能會問什么時候使用這些屬性?
串口驅動程序支持控制線的話,我們連接兩個串口時必須也要把控制線接好。如果串口驅動程序不支持控制線的話,那么我們只需要接好RxD,TxD,Ground三根線即可,控制線可以不接。
我們根據被控制的串口設備所使用的驅動程序是否支持控制線,來設置DtrEnable,RtsEnable,Handshake的值。但一般都未使用控制線。
什么是流控
Handshake指流控,也稱為握手。通信雙方發送數據要考慮對方的處理數據能力,接收方處理不過來發送方就要先暫停發送一段時間,這就是流控。流控可以通過控制線實現,稱為硬流控;流控通過軟件實現,稱為軟流控。現代串口通信一般也不使用流控機制。

接線方式(a)最常用,它沒有流控,Handshake屬性為None。
接線方式(b)使用了軟件流控,Handshake屬性為XOnXOff。
接線方式(c)使用了硬件流控,Handshake屬性為RequestToSend。




