C#開發串口通信實例及串口基礎

2021-02-14 DotNet開發跳槽
一、串口通信簡介

       串行接口(串口)是一種可以將接受來自CPU的並行數據字符轉換為連續的串行數據流發送出去,同時可將接受的串行數據流轉換為並行的數據字符供給CPU的器件。一般完成這種功能的電路,我們稱為串行接口電路。

       串口通信(Serial Communications)的概念非常簡單,串口按位(bit)發送和接收字節。儘管比按字節(byte)的並行通信慢,但是串口可以在使用一根線發送數據的同時用另一根線接收數據。串口通信最重要的參數是波特率、數據位、停止位和奇偶校驗。對於兩個進行通信的埠,這些參數必須匹配。

  1. 波特率:這是一個衡量符號傳輸速率的參數。指的是信號被調製以後在單位時間內的變化,即單位時間內載波參數變化的次數,如每秒鐘傳送960個字符,而每個字符格式包含10位(1個起始位,1個停止位,8個數據位),這時的波特率為960Bd,比特率為10位*960個/秒=9600bps。

  2. 數據位:這是衡量通信中實際數據位的參數。當計算機發送一個信息包,實際的數據往往不會是8位的,標準的值是6、7和8位。標準的ASCII碼是0~127(7位),擴展的ASCII碼是0~255(8位)。

  3. 停止位:用於表示單個包的最後幾位。典型的值為1,1.5和2位。由於數據是在傳輸線上定時的,並且每一個設備有其自己的時鐘,很可能在通信中兩臺設備間出現了小小的不同步。因此停止位不僅僅是表示傳輸的結束,並且提供計算機校正時鐘同步的機會。

  4. 校驗位:在串口通信中一種簡單的檢錯方式。有四種檢錯方式:偶、奇、高和低。當然沒有校驗位也是可以的。

二、C#串口編程類

       從.NET Framework 2.0開始,C#提供了SerialPort類用於實現串口控制。命名空間:System.IO.Ports。其中詳細成員介紹參看MSDN文檔。下面介紹其常用的欄位、方法和事件。

  1. 常用欄位:名稱說明PortName獲取或設置通信埠BaudRate獲取或設置串行波特率DataBits獲取或設置每個字節的標準數據位長度Parity獲取或設置奇偶校驗檢查協議StopBits獲取或設置每個字節的標準停止位數

 

2. 常用方法:名稱說明Close關閉埠連接,將 IsOpen 屬性設置為 false,並釋放內部 Stream 對象GetPortNames獲取當前計算機的串行埠名稱數組Open打開一個新的串行埠連接Read從 SerialPort 輸入緩衝區中讀取Write 將數據寫入串行埠輸出緩衝區

 

 

 

 

 

 

 

 

3. 常用事件:名稱說明DataReceived表示將處理 SerialPort 對象的數據接收事件的方法

 

三、C#開發串口實例

前臺頁面:

 後臺代碼:

using System;

using System.IO.Ports;

using System.Text;

using System.Windows.Forms;

namespace SerialPort

{

    public partial class SerialPort : Form

    {

        String serialPortName;

        public SerialPort()

        {

            InitializeComponent();

        }

        private void Form1_Load(object sender, EventArgs e)

        {

            string[] ports = System.IO.Ports.SerialPort.GetPortNames();//獲取電腦上可用串口號

            comboBox1.Items.AddRange(ports);//給comboBox1添加數據

            comboBox1.SelectedIndex = comboBox1.Items.Count > 0 ? 0 : -1;//如果裡面有數據,顯示第0個

            comboBox2.Text = "115200";/*默認波特率:115200*/

            comboBox3.Text = "1";/*默認停止位:1*/

            comboBox4.Text = "8";/*默認數據位:8*/

            comboBox5.Text = "無";/*默認奇偶校驗位:無*/

        }

        private void button1_Click(object sender, EventArgs e)

        {

            if (button1.Text == "打開串口"){//如果按鈕顯示的是打開

                try{//防止意外錯誤

                    serialPort1.PortName = comboBox1.Text;//獲取comboBox1要打開的串口號

                    serialPortName = comboBox1.Text;

                    serialPort1.BaudRate = int.Parse(comboBox2.Text);//獲取comboBox2選擇的波特率

                    serialPort1.DataBits = int.Parse(comboBox4.Text);//設置數據位

                    /*設置停止位*/

                    if (comboBox3.Text == "1") { serialPort1.StopBits = StopBits.One; }

                    else if (comboBox3.Text == "1.5") { serialPort1.StopBits = StopBits.OnePointFive; }

                    else if (comboBox3.Text == "2") { serialPort1.StopBits = StopBits.Two; }

                    /*設置奇偶校驗*/

                    if (comboBox5.Text == "無") { serialPort1.Parity = Parity.None; }

                    else if (comboBox5.Text == "奇校驗") { serialPort1.Parity = Parity.Odd; }

                    else if (comboBox5.Text == "偶校驗") { serialPort1.Parity = Parity.Even; }

                    serialPort1.Open();//打開串口

                    button1.Text = "關閉串口";//按鈕顯示關閉串口

                }

                catch (Exception err)

                {

                    MessageBox.Show("打開失敗"+ err.ToString(), "提示!");//對話框顯示打開失敗

                }

            }

            else{//要關閉串口

                try{//防止意外錯誤

                    serialPort1.Close();//關閉串口

                }

                catch (Exception){}

                button1.Text = "打開串口";//按鈕顯示打開

            }

        }

        protected override void WndProc(ref Message m)

        {

            if (m.Msg == 0x0219){//設備改變

                if (m.WParam.ToInt32() == 0x8004){//usb串口拔出

                    string[] ports = System.IO.Ports.SerialPort.GetPortNames();//重新獲取串口

                    comboBox1.Items.Clear();//清除comboBox裡面的數據

                    comboBox1.Items.AddRange(ports);//給comboBox1添加數據

                    if (button1.Text == "關閉串口"){//用戶打開過串口

                        if (!serialPort1.IsOpen){//用戶打開的串口被關閉:說明熱插拔是用戶打開的串口

                            button1.Text = "打開串口";

                            serialPort1.Dispose();//釋放掉原先的串口資源

                            comboBox1.SelectedIndex = comboBox1.Items.Count > 0 ? 0 : -1;//顯示獲取的第一個串口號

                        }

                        else{

                            comboBox1.Text = serialPortName;//顯示用戶打開的那個串口號

                        }

                    }

                    else{//用戶沒有打開過串口

                        comboBox1.SelectedIndex = comboBox1.Items.Count > 0 ? 0 : -1;//顯示獲取的第一個串口號

                    }

                }

                else if (m.WParam.ToInt32() == 0x8000){//usb串口連接上

                    string[] ports = System.IO.Ports.SerialPort.GetPortNames();//重新獲取串口

                    comboBox1.Items.Clear();

                    comboBox1.Items.AddRange(ports);

                    if (button1.Text == "關閉串口"){//用戶打開過一個串口

                        comboBox1.Text = serialPortName;//顯示用戶打開的那個串口號

                    }

                    else{

                        comboBox1.SelectedIndex = comboBox1.Items.Count > 0 ? 0 : -1;//顯示獲取的第一個串口號

                    }

                }

            }

            base.WndProc(ref m);

        }

        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)

        {

            int len = serialPort1.BytesToRead;//獲取可以讀取的字節數

            byte[] buff = new byte[len];//創建緩存數據數組

            serialPort1.Read(buff, 0, len);//把數據讀取到buff數組

            

            Invoke((new Action(() =>{//C# 3.0以後代替委託的新方法

                

                    textBox1.AppendText(Encoding.Default.GetString(buff));//對話框追加顯示數據

            })));

        }

        private void button2_Click(object sender, EventArgs e)

        {

            textBox1.Clear();//清除接收對話框顯示的數據

        }

        private void button3_Click(object sender, EventArgs e)

        {

            String Str = textBox2.Text.ToString();//獲取發送文本框裡面的數據

            try

            {

                if (Str.Length > 0)

                {

                   

                        serialPort1.Write(Str);//串口發送數據

                    

                }

            }

            catch (Exception){ }

        }

        private void button4_Click(object sender, EventArgs e)

        {

            textBox2.Clear();//清除發送文本框裡面的內容

        }

    }

}

出處:https://www.cnblogs.com/sgxw/archive/2020/09/17/13686409.html

版權申明:本文來源於網友收集或網友提供,如果有侵權,請轉告版主或者留言,本公眾號立即刪除。

相關焦點

  • 半雙工串口通信實例03:三菱FX3U和歐姆龍CP1H串口通信
    一、串口通信實例目的:三菱FX3U主站數字量輸入X0~X7控制歐姆龍CP1H從站數字量輸出100.00
  • C#做一個簡單的進行串口通信的上位機
    2、串口通信        串口相當於硬體類型的接口。比如無線傳感節點發送信號到匯聚節點,匯聚節點通過串口將數據傳到計算機中的上位機中,上位機接收信息,並處理。      串口是按位(bit)發送和接收字節。串口通信最重要的參數是波特率、數據位、停止位和奇偶校驗。對於兩個進行通信的埠,這些參數必須匹配。    a,波特率:這是一個衡量符號傳輸速率的參數。
  • STM32串口通信基本原理
    2、按照通信方式,分為:    在同步通訊中,收發設備上方會使用一根信號線傳輸信號,在時鐘信號的驅動下雙方進行協調,同步數據。    在同步通訊中,數據信號所傳輸的內容絕大部分是有效數據,而異步通訊中會則會包含數據幀的各種標識符,所以同步通訊效率高,但是同步通訊雙方的時鐘允許誤差小,稍稍時鐘出錯就可能導致數據錯亂,異步通訊雙方的時鐘允許誤差較大。常見的串行通信接口
  • Matlab上位機開發(五)Matlab串口通信
    Matlab串口通信Matlab提供了串口通信的功能,串口通信的流程如下:1.1.創建串口對象創建一個串口對象的API如下:scom = serial('<串口號>');串口號為COM8的形式,這個API有個缺點:不能自動檢測目前電腦中存在中的串口。
  • VC++6.0串口通信技術資料:軟體/源碼/論文/書籍/視頻/控制項/程序
    ,實現了串口數據的收發136、vc下串口通訊開發程序,HostLink協議137、VC下的串口編程,主要實現PC機的串口通訊138、vC下的串口通信程序能夠很好的實現單,很實用139、VC下的串口通信類和一個程序實例140、VC下開發的串口調試工具,界面簡單,方便操作,適用於PC機下與單片機通過串口通信141、vc下寫的串口驅動程序例程
  • STM32實例——USART串口通信實驗(一)
    而我們 STM32 晶片使用的就是 TTL 電平,所以要實現 STM32 與計算機的串口通信,需要進行 TTL與 RS-232C 電平轉換,通常使用的電平轉換晶片是 MAX3232。    在串口通信中通常 PC 機的 DB9 為公頭,單片機上使用的串口 DB9 為母頭,通過一根直通串口線進行相連。
  • Delphi串口通信技術資料:軟體/源碼/論文/書籍/視頻/控制項/程序
    -049、DELPHI與西門子200 PLC的串口通信實例050、Delphi中使用串口控制項MSComm的0字符接收例程051、delphi做的個串口測試程序,可以用來測試硬體的串口通訊052、delphi做的完全的實例,工業監控實例,對想學delphi串口編程很有用053、dephi的串口通信例程 用到了SPComm控制項
  • Matlab串口通信技術資料:軟體/源碼/論文/書籍/視頻/控制項/程序
    Matlab串口通信視頻教程資料06.Matlab串口通信控制項資料07.虛擬串口軟體及使用教程資料08.串口硬體層知識大全資料09.串口調試工具資料10.網絡基礎OSI網絡模型教程資料11.程式設計師成長與發展類書籍資料01.MATLAB
  • C#串口編程示例
    上位機之間要進行數據通信的兩種方式都是基於串口的:上位機軟軟體開發主要包括以下兩種:1、Windows上位機(EXE可執行程序)在Windows上,最早用VB語言開發,後來由於C++的發展,採用MFC開發,近幾年,微軟發布了基於.NET框架的面向對象語言C#,更加穩定安全,再配合微軟強大的VS進行開發,效率奇高;另外,如果想要在Linux上跨平臺運行
  • 深入理解STM32串口通信
    有別於 USART 還有一個UART(UniversalAsynchronous Receiver and Transmitter),它是在 USART 基礎上裁剪掉了同步通信功能,只有異步通信。簡單區分同步和異步就是看通信時需不需要對外提供時鐘輸出,我們平時用的串口通信基本都是 UART。
  • 串口通信技術淺析
    通信過程中所容許的誤差範圍是多少?本文將對上述問題,進行簡單的總結和歸納,以便指導有關的開發工作。2. 概念解釋2.1 串行通信(Serial communication)在通信和計算機科學中,Serial communication是一個通用概念,泛指所有的串行的通信協議,如RS232、USB、I2C、SPI、1-Wire、Ethernet等。
  • STM32F103C8T6工控板與LabVIEW的串口通訊實例
    儘管比按字節(byte)的並行通信慢,但是串口可以在使用一根線發送數據的同時用另一根線接收數據。雖然串口通信傳輸速度不高,但程序簡單,能實現遠距離通信且成本較低,通信長度可達1200米。常用的儀器儀表大多都支持串口通信協議。 LabVIEW的自帶函數庫中有現成的串口通信模塊,方便快速搭建堪比串口調試助手的軟體。
  • Labview串口通信技術資料:軟體/源碼/論文/書籍/視頻/控制項/程序
    串口通信視頻教程資料06.Labview串口通信控制項資料07.虛擬串口軟體及使用教程資料08.串口硬體層知識大全資料09.串口調試工具資料10.網絡基礎OSI網絡模型教程資料11.程式設計師成長與發展類書籍資料01.LabVIEW8.6安裝源文件001、keygen8.6
  • LabVIEW與RS232串口通信
    串口是一種常用的通信接口,許多儀器設備都採用串口進行通信,為了與這些儀器互聯,LabVIEW提供了VISA,實現LabVIEW與其他設備的串口通信
  • 第5章 USART串口通信
    波特率表示每秒發送二進位數據位的速率,單位是bps,即位/秒,波特率越高,傳輸速度越快,常用的UART通信波特率有2400,4800,9600,115200等等。在進行串行通信之前,通信雙方需要設置波特率保持一致,否則不能正常通信。單片機標準串口進行通信時,沒有數據傳輸時通信線路保持高電平狀態。當要發送數據時,先發送一位0,用以表示開始發送,叫做起始位。
  • 上半年最好的Android串口開發入門指南
    Android系統自然也能進行物聯網開發。除開Android本身自帶的模塊還有一類通過外部連結的設備需要通過串口來進行通信。本人在做完兩個相關的抓娃娃和寄存櫃項目之後覺得需要總結一點東西給大家。關於串口串口通信指串口按位(bit)發送和接收字節。儘管比按字節(byte)的並行通信慢,但是串口可以在使用一根線發送數據的同時用另一根線接收數據。
  • VB.NET串口通信技術資料:軟體/源碼/論文/書籍/視頻/控制項/程序
    資料06.VB.NET串口通信控制項資料07.虛擬串口軟體及使用教程資料08.串口硬體層知識大全資料09.串口調試工具資料10.網絡基礎OSI網絡模型教程資料11.程式設計師成長與發展類書籍資料01.Visual Studio 2008安裝源文件
  • 串口通信2.4G nRF24L01無線通信模塊資料匯總
    (6) 內置2.4Ghz 天線,體積小巧約40*22mm    (7) 可連接支持單片機IO口控制、繼電器模塊控制、高低電平信號等的控制利用    (8) 內置專門穩壓電路,外部提供5v電源,內部3.3V低功耗工作電壓    (9) 具備26路單片機IO口,可以控制和驅動多種設備,降低開發難度和產品複雜度。
  • LabVIEW串口通信詳解
    串口可以說是我們最容易見到,也最容易接觸到的一種總線,臺式機上一般都有二個,而現在很多下位機、儀器等很多都還是使用串口通信的1,
  • 樹莓派通用串口通信實驗
    在樹莓派USB TO TTL模塊實驗中學習了通過串口對樹莓派進行控制臺控制,讓串口作為控制終端調試口即 serial console,但是在項目中常常會使用串口同其他傳感器、單片機等設備進行通用串口通信。本實驗中設置樹莓派的串口為通用串口與PC電腦的串口調試工具進行通信。