c# (.net)实现串口热插拔

这段代码展示了如何在C#中处理USB串口的热插拔事件。当USB串口被拔出或插入时,程序会更新comboBox中的可用串口列表,并根据用户是否已打开串口进行相应操作,如关闭已打开的串口或选择新的默认串口。
摘要由CSDN通过智能技术生成

热插拔函数

protected override void WndProc(ref Message m) //热插拔
        {

            try
            {
                if (m.Msg == 0x0219)
                {//设备改变
                    if (m.WParam.ToInt32() == 0x8004)
                    {//usb串口拔出
                        string[] ports = System.IO.Ports.SerialPort.GetPortNames();//重新获取串口
                        comboBox1.Text = "";
                        comboBox1.Items.Clear();//清除comboBox里面的数据
                        comboBox1.Items.AddRange(ports);//给comboBox1添加数据

                        if (buttonCom.Text == "关闭串口")
                        {//用户打开过串口
                         //if (!serialPort1.IsOpen)
                         //{//用户打开的串口被关闭:说明热插拔是用户打开的串口
                            buttonCom.Text = "打开串口";


                            BeginInvoke((new Action(() =>
                            {
                                serialPort1.Close();
                                //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 (buttonCom.Text == "关闭串口")
                        {//用户打开过一个串口
                            comboBox1.Text = serialPortName;//显示用户打开的那个串口号
                        }
                        else
                        {
                            comboBox1.SelectedIndex = comboBox1.Items.Count > 0 ? 0 : -1;//显示获取的第一个串口号
                        }
                    }
                }
                base.WndProc(ref m);
            }
            catch { MessageBox.Show("热插拔错误", "!!"); }


 }


  • 其中的serialPortName设置一个全局变量。
  • 也就是 string serialPortName = “”;
  • 接着在打开串口设备按钮的函数种添加serialPortName = comboBox1.Text;
  • 也就是如下所示:
 private void buttonCom_Click(object sender, EventArgs e)
        {
            //打开串口设备
            try
            {
                if (buttonCom.Text == "打开串口")
                {
                //这里添加
                    serialPortName = comboBox1.Text;
                    
                }
                else
                {
                    buttonCom.Text = "打开串口";
                    textBox5.AppendText("串口已关闭\r\n");
                   
                }
            }
            catch
            {
              
            }
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值