1. 程式人生 > >USB轉串列埠熱插拔檢測

USB轉串列埠熱插拔檢測

         上位機與裝置進行串列埠通訊之前都需要指定PC通訊的串列埠號,這無疑給操作上帶來不便,更痛苦的是每次都得到裝置管理器檢視當前連線的串列埠。

 


       那麼如何通過程式碼獲取當前可用串列埠列表?一是通種登錄檔獲取,操作比較複雜;微軟為我們提供更簡單的方式,通過SerialPort.GetPortNames()方法獲取串列埠列表。使用時需要引用using System.IO.Ports;名字空間。程式碼如下:

        ///<summary>

        /// 建構函式

        ///</summary>

        public MainForm()

        {

            InitializeComponent();

            GetSerialLstTbl();

        }

        ///<summary>

        /// 獲取串列埠列表

        ///</summary>

        private void GetSerialLstTbl()

        {

            //清除comboBoxEx顯示

            comboBoxExUartNum.Items.Clear();                

            //獲取串列埠列表

            string[] serialLst = SerialPort.GetPortNames();

            if (serialLst.Length > 0)

            {

                //取串列埠列表進行排序

                Array.Sort(serialLst);

                //將串列埠列表輸出到comboBoxEx

                comboBoxExUartNum.Items.AddRange(serialLst);

                comboBoxExUartNum.SelectedIndex = 0;

            }

        }

 

        實現上述的前提是必需先插上串列埠再啟動軟體,那麼問題又來了,如果先啟動軟體再插上串列埠軟體並不能檢測出接入的串列埠。解決方法是捕獲裝置熱插拔時windows發出的訊息。

在主窗體中新增如下程式碼: 

        // 系統訊息常量

        public const int WM_DEVICE_CHANGE = 0x219;             //裝置改變           

        public const int DBT_DEVICEARRIVAL = 0x8000;          //裝置插入

        public const int DBT_DEVICE_REMOVE_COMPLETE = 0x8004; //裝置移除

        //訊息處理

        protected override void WndProc(ref Message m)

        {

            switch (m.Msg)                                  //判斷訊息型別

            {

                case WM_DEVICE_CHANGE:                      //裝置改變訊息

                    {

                        GetSerialLstTbl();                  //裝置改變時重新獲取串列埠列表

                    } break;

            }

            base.WndProc(ref m);

        }

上述的實現方法還是比較粗略,因為只要是帶USB介面的裝置進行熱插拔都會重新獲取串列埠列。如果串列埠正在傳送或者接收時進行熱插拔,程式將丟擲異常.此時可以將串列埠先關閉再重新獲取串列埠列表.