C# 之 串口數據偵聽的實現


  當需要編程操縱硬件時會遇到過這樣的問題,就是通過串口來接收硬件發來的數據,或是通過串口向硬件發送某種格式的命令。在C#平台上,可以通過 System.IO.Ports 命名空間下的SerialPort 類來實現。

  下面是我做過的一個簡單的示例,首先獲取本機關聯的串行端口列表,然后獲取配置文件中配置的COM端口,檢查是否在本機串行端口列表中,若在列表中則進一步實例化串口對象,並為串口對象指定數據接收事件來實現監聽,示例代碼如下:

 

using System.IO.Ports;
namespace SerialTest
{
  public class SerialTest
  {
       #region 串口監聽
    
        private SerialPort serialPort = null;
        /// <summary>
        /// 開啟串口監聽
        /// </summary>
        private void StartSerialPortMonitor()
        {
            List<string> comList = GetComlist(false); //首先獲取本機關聯的串行端口列表            
       if (comList.Count == 0)
            {
                DialogForm.Show("提示信息", "當前設備不存在串行端口!");
                System.Environment.Exit(0); //徹底退出應用程序   
            }
            else
            {
                string targetCOMPort = ConfigurationManager.AppSettings["COMPort"].ToString();
                //判斷串口列表中是否存在目標串行端口
                if (!comList.Contains(targetCOMPort))
                {
                    DialogForm.Show("提示信息", "當前設備不存在配置的串行端口!");
                    System.Environment.Exit(0); //徹底退出應用程序   
                }

                serialPort = new SerialPort();

                //設置參數
                serialPort.PortName = ConfigurationManager.AppSettings["COMPort"].ToString(); //通信端口
                serialPort.BaudRate = Int32.Parse(ConfigurationManager.AppSettings["BaudRate"].ToString()); //串行波特率
                serialPort.DataBits = 8; //每個字節的標准數據位長度
                serialPort.StopBits = StopBits.One; //設置每個字節的標准停止位數
                serialPort.Parity = Parity.None; //設置奇偶校驗檢查協議
                serialPort.ReadTimeout = 3000; //單位毫秒
                serialPort.WriteTimeout = 3000; //單位毫秒
                //串口控件成員變量,字面意思為接收字節閥值,
                //串口對象在收到這樣長度的數據之后會觸發事件處理函數
                //一般都設為1
                serialPort.ReceivedBytesThreshold = 1;
                serialPort.DataReceived += new SerialDataReceivedEventHandler(CommDataReceived); //設置數據接收事件(監聽)

                try
                {
                    serialPort.Open(); //打開串口
                }
                catch (Exception ex)
                {
                    DialogForm.Show("提示信息", "串行端口打開失敗!具體原因:" + ex.Message);
                    System.Environment.Exit(0); //徹底退出應用程序   
                }
            }
        }

        /// <summary>
        /// 串口數據處理函數
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void CommDataReceived(Object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
                //Comm.BytesToRead中為要讀入的字節長度
                int len = serialPort.BytesToRead;
                Byte[] readBuffer = new Byte[len];
                serialPort.Read(readBuffer, 0, len); //將數據讀入緩存
                //處理readBuffer中的數據,自定義處理過程
                string msg = encoding.GetString(readBuffer, 0, len); //獲取出入庫產品編號
                DialogForm.Show("接收到的信息", msg);
            }
            catch(Exception ex)
            {
                DialogForm.Show("提示信息", "接收返回消息異常!具體原因:" + ex.Message);
            }
        }

        /// <summary>
        /// 關閉串口
        /// </summary>
        private void Stop()
        {
            serialPort.Close();
        }

        /// <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
            {
                DialogForm.Show("提示信息", "串行端口檢查異常!");
                System.Environment.Exit(0); //徹底退出應用程序   
            }
            return list;
        }  

        #endregion 串口監聽
  }
}

 


免責聲明!

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



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