溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#怎么實現(xiàn)串口通信

發(fā)布時間:2023-04-19 11:56:32 來源:億速云 閱讀:110 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“C#怎么實現(xiàn)串口通信”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

框架準備

出于簡單考慮,首先創(chuàng)建一個Winform項目,本文項目名稱為portTest。

串口通信,至少有兩個串口才能通信,所以拖動兩個GroupBox,一左一右,里面分別放置一個Combobox、一個按鈕,以及兩個TextBox用于發(fā)送和接收內(nèi)容,第二個TextBox要點擊右上角的三角選擇多行。

布局結(jié)果為

C#怎么實現(xiàn)串口通信

其中,串口A和串口B中各控件的名稱為


串口A串口B
comboboxcbAcbB
按鈕btnABtnB
發(fā)送文本框tbSendAtbSendB
接收文本框tbRecvAtbRecvB

串口準備

由于.Net6.0并不內(nèi)置串口通信模塊,所以需要額外下載,點擊菜單欄工具->NuGet包管理器->管理解決方案的NuGet包,點擊瀏覽選項卡,搜索Ports,選擇System.IO.Ports,在右側(cè)出現(xiàn)的詳細信息中,選中portTest項目,點擊安裝按鈕。

C#怎么實現(xiàn)串口通信

此外,如果沒有合適的用于串口測試的硬件設備,可以下載一個虛擬串口,這里推薦開源的com0com,下載之后根據(jù)自己電腦位數(shù)選擇一個進行安裝,記住安裝路徑,安裝結(jié)束后,打開相應路徑中的setupg.exe,如下圖所示,通過Add Pair可以添加串口對

C#怎么實現(xiàn)串口通信

在添加串口對之后,在右側(cè)最上方可以更改串口名字,例如改為COM4和COM5,然后點擊apply,串口名字就會在左側(cè)發(fā)生更改。根據(jù)右側(cè)線路圖可知,發(fā)給COM4的信息,會被轉(zhuǎn)發(fā)給COM5;發(fā)給COM5的信息則會轉(zhuǎn)發(fā)給COM4。

接、化、發(fā)

點擊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)串口通信

“C#怎么實現(xiàn)串口通信”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(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)容。

AI