C#實(shí)現(xiàn)串口通信的示例詳解
框架準(zhǔn)備
出于簡(jiǎn)單考慮,首先創(chuàng)建一個(gè)Winform項(xiàng)目,本文項(xiàng)目名稱為portTest。
串口通信,至少有兩個(gè)串口才能通信,所以拖動(dòng)兩個(gè)GroupBox,一左一右,里面分別放置一個(gè)Combobox、一個(gè)按鈕,以及兩個(gè)TextBox用于發(fā)送和接收內(nèi)容,第二個(gè)TextBox要點(diǎn)擊右上角的三角選擇多行。
布局結(jié)果為
其中,串口A和串口B中各控件的名稱為
串口A | 串口B | |
---|---|---|
combobox | cbA | cbB |
按鈕 | btnA | BtnB |
發(fā)送文本框 | tbSendA | tbSendB |
接收文本框 | tbRecvA | tbRecvB |
串口準(zhǔn)備
由于.Net6.0并不內(nèi)置串口通信模塊,所以需要額外下載,點(diǎn)擊菜單欄工具->NuGet包管理器->管理解決方案的NuGet包,點(diǎn)擊瀏覽選項(xiàng)卡,搜索Ports,選擇System.IO.Ports,在右側(cè)出現(xiàn)的詳細(xì)信息中,選中portTest項(xiàng)目,點(diǎn)擊安裝按鈕。
此外,如果沒有合適的用于串口測(cè)試的硬件設(shè)備,可以下載一個(gè)虛擬串口,這里推薦開源的com0com,下載之后根據(jù)自己電腦位數(shù)選擇一個(gè)進(jìn)行安裝,記住安裝路徑,安裝結(jié)束后,打開相應(yīng)路徑中的setupg.exe,如下圖所示,通過Add Pair可以添加串口對(duì)
在添加串口對(duì)之后,在右側(cè)最上方可以更改串口名字,例如改為COM4和COM5,然后點(diǎn)擊apply,串口名字就會(huì)在左側(cè)發(fā)生更改。根據(jù)右側(cè)線路圖可知,發(fā)給COM4的信息,會(huì)被轉(zhuǎn)發(fā)給COM5;發(fā)給COM5的信息則會(huì)轉(zhuǎn)發(fā)給COM4。
接、化、發(fā)
點(diǎn)擊F7進(jìn)入代碼頁面,開始串口開發(fā),主要分為一下流程。
本文基于.Net6.0在頂級(jí)語句中開發(fā),所以不需要額外using;否則的話需要添加using System.IO.Ports;,以確保串口可以調(diào)用。并聲明兩個(gè)全局變量,用于后續(xù)的串口通信。
SerialPort pA; SerialPort pB;
然后,確保combobox可以正確識(shí)別串口名稱,故而在 InitializeComponent();下方,添加如下循環(huán)
foreach (var item in SerialPort.GetPortNames()) { cbA.Items.Add(item); cbB.Items.Add(item); }
其中,GetPortNames函數(shù)可以獲取所有可用的串口名稱。
接下來,雙擊連接按鈕,創(chuàng)建點(diǎn)擊命令,下面以按鈕A進(jìn)行示例,對(duì)按鈕B只需將所有的A換成B即可。
private void btnA_Click(object sender, EventArgs e) { if (btnA.Text=="連接"){ pA = new SerialPort(cbA.SelectedItem.ToString(), 115200, Parity.Odd, 7, StopBits.One); pA.Open(); pA.DataReceived += PA_DataReceived; btnA.Text = "斷開"; } else{ pA.Close(); btnA.Text = "連接"; } }
在SerialPort的構(gòu)造函數(shù)中,輸入?yún)?shù)分別是串口名稱、波特率、校驗(yàn)位、長(zhǎng)度、截止位。
PA_DataReceived是一個(gè)委托,為串口接收到數(shù)據(jù)時(shí)執(zhí)行的操作,一般寫完+=之后,點(diǎn)擊回車VS會(huì)自動(dòng)創(chuàng)建,其內(nèi)容為
private void PA_DataReceived(object sender, SerialDataReceivedEventArgs e) { byte[] data = new byte[pA.BytesToRead]; pA.Read(data, 0, data.Length);//從串口讀取數(shù)據(jù) string info = Encoding.UTF8.GetString(data); tbRecvA.BeginInvoke(new Action(() => { tbRecvA.Text += $"接收:{info}"; })); }
由于串口的接收函數(shù)是異步執(zhí)行的,并不屬于窗口主線程,所以當(dāng)串口接收到數(shù)據(jù)后,如果想在窗口中顯示,就必須用BeginInvoke來另開一個(gè)線程。
最后,編寫串口的發(fā)送程序,當(dāng)tbSend檢測(cè)到回車鍵時(shí),則發(fā)送文本框中的內(nèi)容。
代碼為
private void tbSendA_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode != Keys.Enter) return; var data = Encoding.UTF8.GetBytes(tbSendA.Text); tbRecvA.Text += $"發(fā)送:{tbSendA.Text}\n"; pA.Write(data, 0, data.Length); }
測(cè)試
上面只實(shí)現(xiàn)了A組串口,將B組串口用相同的方法實(shí)現(xiàn)后,就可以進(jìn)行測(cè)試了,效果如下
到此這篇關(guān)于C#實(shí)現(xiàn)串口通信的示例詳解的文章就介紹到這了,更多相關(guān)C#串口通信內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C# 獲取打印機(jī)當(dāng)前狀態(tài)的方法
C# 獲取打印機(jī)當(dāng)前狀態(tài)的方法,需要的朋友可以參考一下2013-04-04C# 文件上傳下載(Excel導(dǎo)入,多線程下載)功能的實(shí)現(xiàn)代碼
這篇文章主要介紹了C# 文件上傳下載(Excel導(dǎo)入,多線程下載)功能的實(shí)現(xiàn)代碼,需要的朋友可以參考下2017-08-08Unity中的PostProcessScene實(shí)用案例深入解析
這篇文章主要為大家介紹了Unity中的PostProcessScene實(shí)用案例深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05C#固定大小緩沖區(qū)及使用指針復(fù)制數(shù)據(jù)詳解
這篇文章主要為大家介紹了C#固定大小緩沖區(qū)及使用指針復(fù)制數(shù)據(jù)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12C#判斷一個(gè)字符串是否是數(shù)字或者含有某個(gè)數(shù)字的方法
這篇文章主要介紹了C#判斷一個(gè)字符串是否是數(shù)字或者含有某個(gè)數(shù)字的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-06-06