USB转串口热插拔检测


         上位机与设备进行串口通信之前都需要指定PC通信的串口号,这无疑给操作上带来不便,更痛苦的是每次都得到设备管理器查看当前连接的串口。

 USB转串口热插拔检测_第1张图片

USB转串口热插拔检测_第2张图片

       那么如何通过代码获取当前可用串口列表?一是通种注册表获取,操作比较复杂;微软为我们提供更简单的方式,通过SerialPort.GetPortNames()方法获取串口列表。使用时需要引用using System.IO.Ports;名字空间。代码如下:

        /// 

        /// 构造函数

        /// 

        public MainForm()

        {

            InitializeComponent();

            GetSerialLstTbl();

        }

        /// 

        /// 获取串口列表

        /// 

        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;

            }

        }

 USB转串口热插拔检测_第3张图片

 

        实现上述的前提是必需先插上串口再启动软件,那么问题又来了,如果先启动软件再插上串口软件并不能检测出接入的串口。解决方法是捕获设备热插拔时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接口的设备进行热插拔都会重新获取串口列。如果串口正在发送或者接收时进行热插拔,程序将抛出异常.此时可以将串口先关闭再重新获取串口列表.

 

 

你可能感兴趣的:(上位机编程)