0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

串口通訊的術(shù)語解釋

jf_78858299 ? 來源:工控PLC技術(shù) ? 作者:工控PLC技術(shù) ? 2023-04-23 11:14 ? 次閱讀

關(guān)于串口通訊的術(shù)語解釋

最近在研究串口通訊,其中有幾個比較重要的概念,RS-232這種適配于上位機和PC端進行連接,RS-232只限于PC串口和設(shè)備間點對點的通信。它很簡單的就可以進行連接,由于串口通訊是異步的,也就是說你可以同時向兩端或者更多進行數(shù)據(jù)發(fā)送,它們之間的傳輸數(shù)據(jù)類型是byte,串口通信最重要的參數(shù)是波特率、數(shù)據(jù)位、停止位和奇偶校驗。對于兩個進行通信的端口,這些參數(shù)必須匹配。接下來先解釋一下幾個關(guān)于串口通訊的術(shù)語:

第一個波特率,這個東西在不同領(lǐng)域都有涉及,在串口通訊中兩個串口之間通訊之間的信號單元叫做碼元,每分鐘傳遞的信號(碼元)也就是波特率;

第二個數(shù)據(jù)位、停止位:這個聽名字就知道是啥意思了,在傳遞數(shù)據(jù)過程之前,機器會識別你的數(shù)據(jù)是個啥,然后根據(jù)這個類型,去調(diào)整不同的起始位、停止位。

第三個奇偶校驗:就是想知道你這個數(shù)據(jù)有多大,多長,因為傳輸都是1 和 0 ,具體校驗方法如下:

奇校驗:就是讓原有數(shù)據(jù)序列中(包括你要加上的一位)1的個數(shù)為奇數(shù) ---- 1000110(0)你必須添0這樣原來有3個1已經(jīng)是奇數(shù)了所以你添上0之后1的個數(shù)還是奇數(shù)個。

偶校驗:就是讓原有數(shù)據(jù)序列中(包括你要加上的一位)1的個數(shù)為偶數(shù) ---- 1000110(1)你就必須加1了這樣原來有3個1要想1的個數(shù)為偶數(shù)就只能添1了。

串口模擬工具免費下載

如果想要在C#中玩轉(zhuǎn)串口通訊或者模擬串口,你必須先搞個硬件,當然我們是在模擬,那你就弄個模擬的工具唄,

安裝好了之后,桌面會有圖標,然后打開,添加一個串口,具體請看下圖:

圖片

串口通訊代碼的編寫

下面我們就開始代碼的實現(xiàn)了,創(chuàng)建一個.NET Fwk的 Winform 項目,然后開始我們的代碼:

SerialPort sp1 = new SerialPort();
public Form1()
        {
            InitializeComponent();
        }


private void Form1_Load(object sender, EventArgs e)
        {
string[] strCom = SerialPort.GetPortNames();
if (strCom == null)
            {
                MessageBox.Show("本機沒有串口!", "Error");
return;
            }
foreach (string com in System.IO.Ports.SerialPort.GetPortNames())
            {
                cbCom.Items.Add(com);
            }
            cbCom.SelectedIndex = 0;
            sp1.BaudRate = 9600;
            Control.CheckForIllegalCrossThreadCalls = false;
            sp1.DataReceived += Sp1_DataReceived;


            sp1.DtrEnable = true;
            sp1.RtsEnable = true;
            sp1.ReadTimeout = 1000;
            sp1.Close();
        }

在窗體加載中,我們嘗試獲取了本機的所有串口,通過 SerialPort.GetPortNames() 方法,會返回一個字符串數(shù)組,如果沒有就返回null,在其中,我們還設(shè)置了波特率,通過SerialPort類下的 DataReceived 方法,來監(jiān)聽我們的數(shù)據(jù)回傳,還啟用了DTR\\DTS請求方式,通過 ReadTimeOut 對數(shù)據(jù)讀取超時進行了控制。

既然我們監(jiān)聽了數(shù)據(jù)回傳,那么在這個方法中,通過 ReadTimeOut.Read 進行了讀取,直接從0到最后,截取完畢。

private void Sp1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
if (sp1.IsOpen)     //判斷是否打開串口
            {
//輸出當前時間
                DateTime dt = DateTime.Now;
                txtReceived.Text += dt.GetDateTimeFormats('f')[0].ToString() + "\\r\\n";
                Byte[] receivedData = new Byte[sp1.BytesToRead];        //創(chuàng)建接收字節(jié)數(shù)組
                sp1.Read(receivedData, 0, receivedData.Length);         //讀取數(shù)據(jù)
                AddContent(new UTF8Encoding().GetString(receivedData));
            }
else
            {
                MessageBox.Show("請打開某個串口", "錯誤提示");
            }
        }


private void AddContent(string v)
        {
this.BeginInvoke(new MethodInvoker(delegate
            {
                txtReceived.AppendText(v);
                txtReceived.AppendText("\\r\\n");
            }));
        }

當然以上的操作都必須在打開串口之后才能進行,打開串口這個還是比較費勁的,因為要設(shè)置各種參數(shù),也就是我剛才說的那幾個概念,如果不對,你讓其他的端口來訪問就找不到了。

private void button2_Click(object sender, EventArgs e)
        {
if (!sp1.IsOpen)
            {
try
                { 
string serialName = cbCom.SelectedItem.ToString();
                    sp1.PortName = serialName;
string strBaudRate = cbBaudRate.Text;
string strDateBits = cbDataBits.Text;
string strStopBits = cbStop.Text;
                    Int32 iBaudRate = Convert.ToInt32(strBaudRate);
                    Int32 iDateBits = Convert.ToInt32(strDateBits);
                    sp1.BaudRate = iBaudRate;       //波特率
                    sp1.DataBits = iDateBits;       //數(shù)據(jù)位
switch (cbStop.Text)            //停止位
                    {
case "1":
                            sp1.StopBits = StopBits.One;
break;
case "1.5":
                            sp1.StopBits = StopBits.OnePointFive;
break;
case "2":
                            sp1.StopBits = StopBits.Two;
break;
default:
                            MessageBox.Show("Error:參數(shù)不正確!", "Error");
break;
                    }
switch (cbCheck.Text)             //校驗位
                    {
case "無":
                            sp1.Parity = Parity.None;
break;
case "奇校驗":
                            sp1.Parity = Parity.Odd;
break;
case "偶校驗":
                            sp1.Parity = Parity.Even;
break;
default:
                            MessageBox.Show("Error:參數(shù)不正確!", "Error");
break;
                    }


if (sp1.IsOpen == true)
                    {
                        sp1.Close();
                    }


//設(shè)置必要控件不可用
                    cbCom.Enabled = false;
                    cbBaudRate.Enabled = false;
                    cbDataBits.Enabled = false;
                    cbStop.Enabled = false;
                    cbCheck.Enabled = false;
                    sp1.Open();     //打開串口
                    button2.Text = "關(guān)閉串口";
                }
catch (System.Exception ex)
                {
                    MessageBox.Show("Error:" + ex.Message, "Error");
return;
                }
            }
else
            {
                cbCom.Enabled = true;
                cbBaudRate.Enabled = true;
                cbDataBits.Enabled = true;
                cbStop.Enabled = true;
                cbCheck.Enabled = true;
                sp1.Close();                    //關(guān)閉串口
                button2.Text = "打開串口";
            }
        }

最后也就是發(fā)送了,剛才我們接收使用Read,發(fā)送也當然很簡單,是Write...

private void button1_Click(object sender, EventArgs e)
        {
byte[] sendData = null;
if (!sp1.IsOpen) //如果沒打開
            {
                MessageBox.Show("請先打開串口!", "Error");
return;
            }
            String strSend = txtSendStr.Text;
try
            {
                sendData = Encoding.UTF8.GetBytes(txtSendStr.Text.Trim());
                sp1.Write(sendData, 0, sendData.Length);
            }
catch (Exception ex)
            {
                MessageBox.Show("Error:" + ex.Message, "Error");
            }


        }
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • RS-232
    +關(guān)注

    關(guān)注

    0

    文章

    388

    瀏覽量

    49936
  • 串口通信
    +關(guān)注

    關(guān)注

    34

    文章

    1626

    瀏覽量

    55529
  • 上位機
    +關(guān)注

    關(guān)注

    27

    文章

    942

    瀏覽量

    54815
收藏 人收藏

    評論

    相關(guān)推薦

    LED燈帶常用規(guī)格術(shù)語解釋

    下面就把LED燈帶常用的5種規(guī)格術(shù)語進行一下解釋和分享,同時也供采購朋友們參考:
    發(fā)表于 04-20 15:11 ?1.4w次閱讀

    FPGA 英文術(shù)語解釋

    FPGA 英文術(shù)語解釋,對初學(xué)者很有裨益。
    發(fā)表于 06-14 23:28

    光電開關(guān)的分類和術(shù)語解釋

    光電開關(guān)介紹及術(shù)語解釋
    發(fā)表于 05-13 09:56

    電子類縮略語-專業(yè)術(shù)語解釋

    電子類縮略語及專業(yè)術(shù)語解釋。
    發(fā)表于 07-05 15:48 ?0次下載

    紅外線光電開關(guān)術(shù)語解釋

    紅外線光電開關(guān)術(shù)語解釋
    發(fā)表于 06-30 19:42 ?1182次閱讀

    Allegro做padstack時的術(shù)語解釋

    Allegro做padstack時的術(shù)語解釋 做padstack的一些問題:在本圖片中的 regular pad , thermal relief , anti pad 在做padstack中的具體區(qū)別是什么麻煩大嚇幫我詳細解說一下
    發(fā)表于 03-22 16:39 ?3280次閱讀
    Allegro做padstack時的<b class='flag-5'>術(shù)語</b><b class='flag-5'>解釋</b>

    手機常用名詞術(shù)語解釋

    手機常用名詞術(shù)語解釋 從結(jié)構(gòu)類型上來看,主要有如下五種:  直板式 Candybar 折疊式 Clamshell 滑蓋
    發(fā)表于 06-21 22:58 ?3053次閱讀

    MP3術(shù)語解釋

    MP3術(shù)語解釋 時下許多人都擁有了自己的MP3隨身聽,但是面對眼花繚亂的MP3術(shù)語眾多MP3小蟲們還是不知所措。也許在以后購買MP3時JP們
    發(fā)表于 02-02 14:07 ?846次閱讀

    軟板(FPC)相關(guān)術(shù)語解釋

    軟板(FPC)相關(guān)術(shù)語解釋 1、Access Hole 露出孔(穿露孔,露底孔)常指軟板外表的保護層 Coverlay(須先沖切出的穿露孔),用以貼合在軟板線路表面做
    發(fā)表于 02-21 10:29 ?4311次閱讀

    LED專業(yè)術(shù)語解釋

    LED專業(yè)術(shù)語解釋VF、IV、WL、IR 解釋及光通量換算關(guān)系,LED的Vf值是什么意思?它的大小對LED有什么影響?
    發(fā)表于 01-06 15:34 ?5484次閱讀

    太陽能光伏術(shù)語和名詞解釋(齊全)

    電子發(fā)燒友為大家整理了相關(guān)的太陽能光伏術(shù)語和名詞解釋(齊全)
    發(fā)表于 04-23 11:23 ?8913次閱讀

    LED專業(yè)術(shù)語解釋

    LED專業(yè)術(shù)語解釋,LED燈飾入門知識。
    發(fā)表于 03-04 14:15 ?0次下載

    科普:示波器常用的術(shù)語解釋

    科普:示波器常用的術(shù)語解釋
    發(fā)表于 07-15 18:55 ?3次下載
    科普:示波器常用的<b class='flag-5'>術(shù)語</b><b class='flag-5'>解釋</b>

    關(guān)于串口通訊術(shù)語解釋及代碼的編寫

    在窗體加載中,我們嘗試獲取了本機的所有串口,通過 SerialPort.GetPortNames() 方法,會返回一個字符串數(shù)組,如果沒有就返回null,在其中,我們還設(shè)置了波特率,通過SerialPort類下的 DataReceived 方法
    發(fā)表于 02-22 11:42 ?552次閱讀

    電磁兼容基本術(shù)語和定義的應(yīng)用與解釋.zip

    電磁兼容基本術(shù)語和定義的應(yīng)用與解釋
    發(fā)表于 12-30 09:21 ?2次下載