C# SerialPort實(shí)現(xiàn)串口通訊的代碼詳解
串口通信
在.NET平臺(tái)下創(chuàng)建C#串口通信程序,.NET 2.0提供了串口通信的功能,其命名空間是System.IO.Ports。這個(gè)新的框架不但可以訪問(wèn)計(jì)算機(jī)上的串口,還可以和串口設(shè)備進(jìn)行通信。
創(chuàng)建C#串口通信程序之命名空間 System.IO.Ports命名空間中最重用的是SerialPort 類。 創(chuàng)建C#串口通信程序之創(chuàng)建SerialPort 對(duì)象 通過(guò)創(chuàng)建SerialPort 對(duì)象,我們可以在程序中控制串口通信的全過(guò)程。
正文
屬性
BaseStream | 獲取 Stream 對(duì)象的基礎(chǔ) SerialPort 對(duì)象。 |
BaudRate | 獲取或設(shè)置串行波特率。 |
BreakState | 獲取或設(shè)置中斷信號(hào)狀態(tài)。 |
BytesToRead | 獲取接收緩沖區(qū)中數(shù)據(jù)的字節(jié)數(shù)。 |
BytesToWrite | 獲取發(fā)送緩沖區(qū)中數(shù)據(jù)的字節(jié)數(shù)。 |
CDHolding | 獲取端口的載波檢測(cè)行的狀態(tài)。 |
CtsHolding | 獲取“可以發(fā)送”行的狀態(tài)。 |
DataBits | 獲取或設(shè)置每個(gè)字節(jié)的標(biāo)準(zhǔn)數(shù)據(jù)位長(zhǎng)度。 |
DiscardNull | 獲取或設(shè)置一個(gè)值,該值指示 null 字節(jié)在端口和接收緩沖區(qū)之間傳輸時(shí)是否被忽略。 |
DsrHolding | 獲取數(shù)據(jù)設(shè)置就緒 (DSR) 信號(hào)的狀態(tài)。 |
DtrEnable | 獲取或設(shè)置一個(gè)值,該值在串行通信過(guò)程中啟用數(shù)據(jù)終端就緒 (DTR) 信號(hào)。 |
Encoding | 獲取或設(shè)置傳輸前后文本轉(zhuǎn)換的字節(jié)編碼。 |
Handshake | 使用 Handshake 中的值獲取或設(shè)置串行端口數(shù)據(jù)傳輸?shù)奈帐謪f(xié)議。 |
IsOpen | 獲取一個(gè)值,該值指示 SerialPort 對(duì)象的打開(kāi)或關(guān)閉狀態(tài)。 |
NewLine | 獲取或設(shè)置用于解釋 ReadLine() 和 WriteLine(String) 方法調(diào)用結(jié)束的值。 |
Parity | 獲取或設(shè)置奇偶校驗(yàn)檢查協(xié)議。 |
ParityReplace | 獲取或設(shè)置一個(gè)字節(jié),該字節(jié)在發(fā)生奇偶校驗(yàn)錯(cuò)誤時(shí)替換數(shù)據(jù)流中的無(wú)效字節(jié)。 |
PortName | 獲取或設(shè)置通信端口,包括但不限于所有可用的 COM 端口。 |
ReadBufferSize | 獲取或設(shè)置 SerialPort 輸入緩沖區(qū)的大小。 |
ReadTimeout | 獲取或設(shè)置讀取操作未完成時(shí)發(fā)生超時(shí)之前的毫秒數(shù)。 |
ReceivedBytesThreshold | 獲取或設(shè)置 DataReceived 事件發(fā)生前內(nèi)部輸入緩沖區(qū)中的字節(jié)數(shù)。 |
RtsEnable | 獲取或設(shè)置一個(gè)值,該值指示在串行通信中是否啟用請(qǐng)求發(fā)送 (RTS) 信號(hào)。 |
StopBits | 獲取或設(shè)置每個(gè)字節(jié)的標(biāo)準(zhǔn)停止位數(shù)。 |
WriteBufferSize | 獲取或設(shè)置串行端口輸出緩沖區(qū)的大小。 |
WriteTimeout | 獲取或設(shè)置寫(xiě)入操作未完成時(shí)發(fā)生超時(shí)之前的毫秒數(shù)。 |
方法
Close() | 關(guān)閉端口連接,將 IsOpen 屬性設(shè)置為 false ,并釋放內(nèi)部 Stream 對(duì)象。 |
DiscardInBuffer() | 丟棄來(lái)自串行驅(qū)動(dòng)程序的接收緩沖區(qū)的數(shù)據(jù)。 |
DiscardOutBuffer() | 丟棄來(lái)自串行驅(qū)動(dòng)程序的傳輸緩沖區(qū)的數(shù)據(jù)。 |
GetPortNames() | 獲取當(dāng)前計(jì)算機(jī)的串行端口名的數(shù)組。 |
Open() | 打開(kāi)一個(gè)新的串行端口連接。 |
Read(Byte[], Int32, Int32) | 從 SerialPort 輸入緩沖區(qū)讀取一些字節(jié)并將那些字節(jié)寫(xiě)入字節(jié)數(shù)組中指定的偏移量處。 |
Read(Char[], Int32, Int32) | 從 SerialPort 輸入緩沖區(qū)中讀取一些字符,然后將這些字符寫(xiě)入字符數(shù)組中指定的偏移量處。 |
ReadByte() | 從 SerialPort 輸入緩沖區(qū)中同步讀取一個(gè)字節(jié)。 |
ReadChar() | 從 SerialPort 輸入緩沖區(qū)中同步讀取一個(gè)字符。 |
ReadExisting() | 在編碼的基礎(chǔ)上,讀取 SerialPort 對(duì)象的流和輸入緩沖區(qū)中所有立即可用的字節(jié)。 |
ReadLine() | 一直讀取到輸入緩沖區(qū)中的 NewLine 值。 |
ReadTo(String) | 一直讀取到輸入緩沖區(qū)中的指定 value 的字符串。 |
Write(Byte[], Int32, Int32) | 使用緩沖區(qū)中的數(shù)據(jù)將指定數(shù)量的字節(jié)寫(xiě)入串行端口。 |
Write(Char[], Int32, Int32) | 使用緩沖區(qū)中的數(shù)據(jù)將指定數(shù)量的字符寫(xiě)入串行端口。 |
Write(String) | 將指定的字符串寫(xiě)入串行端口。 |
WriteLine(String) | 將指定的字符串和 NewLine 值寫(xiě)入輸出緩沖區(qū)。 |
Nuget 安裝System.IO.Ports
串口寫(xiě)
private void btnWrite_Click(object sender, EventArgs e) { SerialPort serialPort = new SerialPort(); serialPort.PortName = "COM1";//串口名稱 serialPort.BaudRate = 9600; //獲取或設(shè)置波特率 serialPort.Parity = Parity.Even;//獲取或設(shè)置校驗(yàn)位 serialPort.DataBits = 8;//獲取或設(shè)置數(shù)據(jù)位默認(rèn)值8 serialPort.StopBits = StopBits.One;// 停止位 serialPort.Open(); serialPort.Write("A"); serialPort.Close(); }
串口讀
SerialPort serialPort = new SerialPort(); private void btnRead_Click(object sender, EventArgs e) { byte[] a = System.Text.Encoding.ASCII.GetBytes(" "); serialPort.PortName = "COM1";//串口名稱 serialPort.BaudRate = 9600; //獲取或設(shè)置波特率 serialPort.Parity = Parity.None;//獲取或設(shè)置校驗(yàn)位 serialPort.DataBits = 8;//獲取或設(shè)置數(shù)據(jù)位默認(rèn)值8 serialPort.StopBits = StopBits.One;// 停止位 serialPort.DataReceived += SerialPort_DataReceived; serialPort.Open(); } private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { byte[] b = new byte[8]; int A = serialPort.Read(b, 0, 8); this.Invoke(() => { string s = ByteToHex(b); txtValue.Text += s+System.Environment.NewLine; }); } public string ByteToHex(byte[] Bytes) { string str = string.Empty; foreach (byte Byte in Bytes) { str += String.Format("{0:X2}", Byte) + " "; } return str.Trim(); }
一個(gè)完整例子
using System.IO.Ports; namespace SCOM { public partial class FrmMain : Form { SerialPort serialPort; public FrmMain() { InitializeComponent(); Init(); } private void LoadPorts() { cboPort.Items.Clear(); string[] port = System.IO.Ports.SerialPort.GetPortNames(); foreach (var item in port) { cboPort.Items.Add(item); } cboPort.SelectedIndex = 0; } private void Init() { LoadPorts(); object[] baudRate = { 4800, 9600, 19200, 38400, 57600, 115200, 230400 }; cboBaudRate.Items.AddRange(baudRate); cboBaudRate.SelectedIndex = 1; cboDataBits.Items.Add(7); cboDataBits.Items.Add(8); cboDataBits.SelectedIndex = 1; cboStopBits.Items.Add("One"); cboStopBits.Items.Add("OnePointFive"); cboStopBits.Items.Add("Two"); cboStopBits.SelectedIndex = 0; //Parity cboParity.Items.Add("None"); cboParity.Items.Add("Even"); cboParity.Items.Add("Mark"); cboParity.Items.Add("Odd"); cboParity.Items.Add("Space"); cboParity.SelectedIndex = 0; cboHandshaking.Items.Add("None"); cboHandshaking.Items.Add("XOnXOff"); cboHandshaking.Items.Add("RequestToSend"); cboHandshaking.Items.Add("RequestToSendXOnXOff"); cboHandshaking.SelectedIndex = 0; btnClosePort.Enabled = false; } private void btnRefresh_Click(object sender, EventArgs e) { LoadPorts(); } private void btnOpenPort_Click(object sender, EventArgs e) { if (serialPort == null) { serialPort = new SerialPort(); } serialPort.PortName = cboPort.Text;//串口名稱 serialPort.BaudRate = int.Parse(cboBaudRate.Text); //獲取或設(shè)置波特率 serialPort.Parity = (Parity)Enum.Parse(typeof(Parity), cboParity.Text);//獲取或設(shè)置校驗(yàn)位 serialPort.DataBits = int.Parse(cboDataBits.Text);//獲取或設(shè)置數(shù)據(jù)位默認(rèn)值8 serialPort.StopBits = (StopBits)Enum.Parse(typeof(StopBits), cboStopBits.Text);// 停止位 serialPort.Handshake = (Handshake)Enum.Parse(typeof(Handshake), cboHandshaking.Text);// 握手協(xié)議 serialPort.DataReceived += SerialPort_DataReceived; serialPort.Open(); stsMain_lblStatus.Text = "端口已打開(kāi)"; btnOpenPort.Enabled = false; btnClosePort.Enabled = true; } private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { this.Invoke(new Action(() => { byte[] b = new byte[8]; int A = serialPort.Read(b, 0, 8); string s = ""; if (rdoHex.Checked) { s = ByteToHex(b); } else { s = System.Text.Encoding.Default.GetString(b); } txtReceive.AppendText(System.Environment.NewLine+ s); })); } private void btnClosePort_Click(object sender, EventArgs e) { if (serialPort != null && serialPort.IsOpen) { serialPort.DataReceived -= SerialPort_DataReceived; serialPort.Close(); stsMain_lblStatus.Text = "端口已關(guān)閉"; btnOpenPort.Enabled = true; btnClosePort.Enabled = false; } } private void btnSend_Click(object sender, EventArgs e) { if (serialPort == null || !serialPort.IsOpen) { return; } serialPort.Write(txtSend.Text); } private string ByteToHex(byte[] Bytes) { string str = string.Empty; foreach (byte Byte in Bytes) { str += String.Format("{0:X2}", Byte) + " "; } return str.Trim(); } } }
以上就是C# SerialPort實(shí)現(xiàn)串口通訊的代碼詳解的詳細(xì)內(nèi)容,更多關(guān)于C# SerialPort串口通訊的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
簡(jiǎn)單了解C#設(shè)計(jì)模式編程中的橋接模式
這篇文章主要介紹了C#設(shè)計(jì)模式編程中的橋接模式,橋接模式經(jīng)常應(yīng)用于解耦邏輯層與數(shù)據(jù)操作層,需要的朋友可以參考下2016-02-02一文詳解C#中數(shù)組、鏈表、Hash的優(yōu)缺點(diǎn)
在 C# 中,數(shù)組(Array)、鏈表(LinkedList)和哈希表(Hash)是常用的數(shù)據(jù)結(jié)構(gòu),每種都有其自身的優(yōu)缺點(diǎn),本文將通過(guò)代碼示例給大家詳細(xì)的介紹一下,需要的朋友可以參考下2024-02-02C#鍵盤(pán)輸入回車鍵實(shí)現(xiàn)點(diǎn)擊按鈕效果的方法
這篇文章主要介紹了C#鍵盤(pán)輸入回車鍵實(shí)現(xiàn)點(diǎn)擊按鈕效果的方法,可實(shí)現(xiàn)用回車鍵代替點(diǎn)擊按鈕的功能,是非常實(shí)用的技巧,需要的朋友可以參考下2014-09-09C# 正則表達(dá)式常用的符號(hào)和模式解析(最新推薦)
這篇文章主要介紹了C# 正則表達(dá)式常用的符號(hào)和模式解析,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12c# 判斷指定文件是否存在的簡(jiǎn)單實(shí)現(xiàn)
這篇文章主要介紹了c# 判斷指定文件是否存在的簡(jiǎn)單實(shí)現(xiàn),需要的朋友可以參考下2014-02-02C#連接藍(lán)牙設(shè)備的實(shí)現(xiàn)示例
本文主要介紹了C#連接藍(lán)牙設(shè)備的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01C#創(chuàng)建一個(gè)小型Web Server(Socket實(shí)現(xiàn))
這篇文章主要介紹了關(guān)于C#利用Socket實(shí)現(xiàn)創(chuàng)建一個(gè)小型Web Server的相關(guān)資料,文中通過(guò)示例代碼介紹的很詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-02-02C#控件picturebox實(shí)現(xiàn)畫(huà)圖功能
這篇文章主要為大家詳細(xì)介紹了C#控件picturebox實(shí)現(xiàn)畫(huà)圖功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09