VS編程,C#串口通訊,通過串口讀取數據的一種方法


一、可能需要的軟件:
1、虛擬串口vspd(Virtual Serial Port Driver,用來在電腦上虛擬出一對串口,模擬通訊。

2、友善串口調試助手,用來發送、讀取數據。

二、思路
1、查詢本機所有的串口

2、判斷需要的串口是否存在本機的串口中

3、設置串口的參數,如波特率、奇偶校驗等。

4、打開串口,

5、通過串口讀取數據,處理數據

6、關閉當前窗口時,將串口一並關閉。

7、可以寫一個定時器,來循環執行1、2兩步,並判斷串口是否打開,以保持串口通訊正常。

三,代碼

1、查詢本機所有的串口

 /// <summary>
        /// 獲取本機串口列表
        /// </summary>
        /// <param name="isUseReg"></param>
        /// <returns></returns>
        private List<string> GetComlist(bool isUseReg)
        {
            List<string> list = new List<string>();
            try
            {
                if (isUseReg)
                {
                    RegistryKey RootKey = Registry.LocalMachine;
                    RegistryKey Comkey = RootKey.OpenSubKey(@"HARDWARE\DEVICEMAP\SERIALCOMM");
 
                    String[] ComNames = Comkey.GetValueNames();
 
                    foreach (String ComNamekey in ComNames)
                    {
                        string TemS = Comkey.GetValue(ComNamekey).ToString();
                        list.Add(TemS);
                    }
                }
                else
                {
                    foreach (string com in SerialPort.GetPortNames())  //自動獲取串行口名稱  
                        list.Add(com);
                }
            }
            catch
            {
                MessageBox.Show("串行端口檢查異常!", "提示信息");
                // System.Environment.Exit(0); //徹底退出應用程序   
            }
            return list;
        }

2、判斷需要的串口是否存在本機的串口中

/// <summary>
        /// 判斷是否存在當前串口
        /// </summary>
        private void StartSerialPortMonitor()
        {
            List<string> comList = GetComlist(false); //首先獲取本機關聯的串行端口列表     
            if (comList.Count == 0)
            {
                MessageBox.Show("當前設備不存在串行端口!", "提示信息");
                // System.Environment.Exit(0); //徹底退出應用程序   
            }
            else
            {
                string targetCOMPort = "COM8";
                //判斷串口列表中是否存在目標串行端口
                if (!comList.Contains(targetCOMPort))
                {
                    MessageBox.Show("提示信息", "當前設備不存在配置的串行端口!");
                    //System.Environment.Exit(0); //徹底退出應用程序   
                }
            }
        }

3、設置串口的參數,如波特率、奇偶校驗等。

首先定義字段:

private SerialPort serialPort;

/// <summary>
        /// 設置通訊串口
        /// </summary>
        public void setcom()
        {
            try
            {
                StartSerialPortMonitor();
                serialPort.PortName = "COM8"; //通信端口
                serialPort.BaudRate = 9600; //串行波特率
                serialPort.DataBits = 8; //每個字節的標准數據位長度
                serialPort.StopBits = StopBits.Two; //設置每個字節的標准停止位數
                serialPort.Parity = Parity.None; //設置奇偶校驗檢查協議
                //下面這句是當信息中有漢字時,能正確傳輸,不然會出現問號。
                serialPort.Encoding = System.Text.Encoding.GetEncoding("GB2312");
                //串口控件成員變量,字面意思為接收字節閥值,
                //串口對象在收到這樣長度的數據之后會觸發事件處理函數
                //一般都設為1
                serialPort.ReceivedBytesThreshold = 1;
                serialPort.DataReceived += new SerialDataReceivedEventHandler(CommDataReceived); //設置數據接收事件(監聽)
 
                serialPort.Open(); //打開串口
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
 
        }

4、打開串口,

5、通過串口讀取數據,處理數據

/// <summary>
        /// 通訊有數據進執行
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void CommDataReceived(Object sender, SerialDataReceivedEventArgs e)
        {
            getcom();
        }
public void getcom()
        {
            try
            {
                //定義一個字段,來保存串口傳來的信息。
                string str = "";
 
                int len = serialPort.BytesToRead;
                Byte[] readBuffer = new Byte[len];
                serialPort.Read(readBuffer, 0, len);
                str = Encoding.Default.GetString(readBuffer);
                      
 
                //如果需要和界面上的控件交互顯示數據,使用下面的方法。其中ttt是控件的名稱。
                 //this.tttt.Dispatcher.Invoke(new Action(() =>
                //{
                //    tttt.Text = str ;
                //}));
 
 
                serialPort.DiscardInBuffer();  //清空接收緩沖區     
                }
                  catch (Exception ex)
            {
                serialPort.Close();
                MessageBox.Show(ex.Message);
            }
       }

6、關閉當前窗口時,將串口一並關閉

private void MainWindow1_Closed(object sender, EventArgs e)
        {
            if (serialPort.IsOpen)
            {
                serialPort.Close();
            }
        }

 

7、可以寫一個定時器,來循環執行1、2兩步,保持串口通訊正常。

如果電腦不存在串口,提示警告

如果目標串口不在電腦的串口列表里,提示警告,

如果目標串口當前是關閉的狀態,將其打開。

如果串口已經打開,再次打開會報錯,無法正常工作。一定要注意。
if (!serialPort.IsOpen)
            {
                serialPort.Open();
            }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM