您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“C#怎么實現(xiàn)串口通信”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!
出于簡單考慮,首先創(chuàng)建一個Winform項目,本文項目名稱為portTest。
串口通信,至少有兩個串口才能通信,所以拖動兩個GroupBox,一左一右,里面分別放置一個Combobox、一個按鈕,以及兩個TextBox用于發(fā)送和接收內(nèi)容,第二個TextBox要點擊右上角的三角選擇多行。
布局結(jié)果為
其中,串口A和串口B中各控件的名稱為
串口A | 串口B | |
---|---|---|
combobox | cbA | cbB |
按鈕 | btnA | BtnB |
發(fā)送文本框 | tbSendA | tbSendB |
接收文本框 | tbRecvA | tbRecvB |
由于.Net6.0并不內(nèi)置串口通信模塊,所以需要額外下載,點擊菜單欄工具->NuGet包管理器->管理解決方案的NuGet包,點擊瀏覽選項卡,搜索Ports,選擇System.IO.Ports,在右側(cè)出現(xiàn)的詳細信息中,選中portTest項目,點擊安裝按鈕。
此外,如果沒有合適的用于串口測試的硬件設備,可以下載一個虛擬串口,這里推薦開源的com0com,下載之后根據(jù)自己電腦位數(shù)選擇一個進行安裝,記住安裝路徑,安裝結(jié)束后,打開相應路徑中的setupg.exe,如下圖所示,通過Add Pair可以添加串口對
在添加串口對之后,在右側(cè)最上方可以更改串口名字,例如改為COM4和COM5,然后點擊apply,串口名字就會在左側(cè)發(fā)生更改。根據(jù)右側(cè)線路圖可知,發(fā)給COM4的信息,會被轉(zhuǎn)發(fā)給COM5;發(fā)給COM5的信息則會轉(zhuǎn)發(fā)給COM4。
點擊F7進入代碼頁面,開始串口開發(fā),主要分為一下流程。
本文基于.Net6.0在頂級語句中開發(fā),所以不需要額外using;否則的話需要添加using System.IO.Ports;,以確保串口可以調(diào)用。并聲明兩個全局變量,用于后續(xù)的串口通信。
SerialPort pA; SerialPort pB;
然后,確保combobox可以正確識別串口名稱,故而在 InitializeComponent();下方,添加如下循環(huán)
foreach (var item in SerialPort.GetPortNames()) { cbA.Items.Add(item); cbB.Items.Add(item); }
其中,GetPortNames函數(shù)可以獲取所有可用的串口名稱。
接下來,雙擊連接按鈕,創(chuàng)建點擊命令,下面以按鈕A進行示例,對按鈕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ù)分別是串口名稱、波特率、校驗位、長度、截止位。
PA_DataReceived是一個委托,為串口接收到數(shù)據(jù)時執(zhí)行的操作,一般寫完+=之后,點擊回車VS會自動創(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í)行的,并不屬于窗口主線程,所以當串口接收到數(shù)據(jù)后,如果想在窗口中顯示,就必須用BeginInvoke來另開一個線程。
最后,編寫串口的發(fā)送程序,當tbSend檢測到回車鍵時,則發(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); }
上面只實現(xiàn)了A組串口,將B組串口用相同的方法實現(xiàn)后,就可以進行測試了,效果如下
“C#怎么實現(xiàn)串口通信”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。