C#串口判定USB是否拔出问题检测/弹出“对窗口的访问被拒绝”

主要参考如下:下面这里也给出了串口助手开发的相关过程和USB热拔插检测相关。

https://blog.csdn.net/weixin_44547715/article/details/105958317?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164854319116780357276896%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164854319116780357276896&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-2-105958317.142v5pc_search_result_control_group,143v6control&utm_term=C%23%E4%B8%B2%E5%8F%A3%E6%8B%94%E5%87%BA%E5%90%8E%E6%8A%A5%E9%94%99&spm=1018.2226.3001.4187

测验代码部分如下:

 protected override void WndProc(ref Message m)
        {
            String serialPortName;
            serialPortName = cbx_commNo.Text;
            try
            {
                if (m.Msg == 0x0219)
                {//设备改变
                    if (m.WParam.ToInt32() == 0x8004)
                    {//usb串口拔出
                        string[] ports = System.IO.Ports.SerialPort.GetPortNames();//重新获取串口
                        cbx_commNo.Items.Clear();//清除comboBox里面的数据
                        cbx_commNo.Items.AddRange(ports);//给comboBox1添加数据
                        if (btn_comm.Text == "关闭串口")
                        {//用户打开过串口
                            if (!serialPort1.IsOpen)
                            {//用户打开的串口被关闭:说明热插拔是用户打开的串口
                                btn_comm.Text = "打开串口";
                                COM_Closing = true;
                                //bSyncTimeEnable = false;
                                // btn_synCurTime.
                                //System.Environment.Exit(0);
                                serialPort1.Dispose();//释放掉原先的串口资源
                                //serialPort1.Close();
                                cbx_commNo.SelectedIndex = cbx_commNo.Items.Count > 0 ? 0 : -1;//显示获取的第一个串口号

                                lbl_commStasData.Text = "串口已断开";
                                lbl_commStasData.ForeColor = Color.Red;
                                timerSendData.Enabled = false;
                            }
                            else
                            {
                                cbx_commNo.Text = serialPortName;//显示用户打开的那个串口号
                            }
                        }
                        else
                        {//用户没有打开过串口
                            cbx_commNo.SelectedIndex = cbx_commNo.Items.Count > 0 ? 0 : -1;//显示获取的第一个串口号
                        }
                    }
                    else if (m.WParam.ToInt32() == 0x8000)
                    {//usb串口连接上
                        string[] ports = System.IO.Ports.SerialPort.GetPortNames();//重新获取串口
                        cbx_commNo.Items.Clear();
                        cbx_commNo.Items.AddRange(ports);
                        if (btn_comm.Text == "关闭串口")
                        {//用户打开过一个串口
                            cbx_commNo.Text = serialPortName;//显示用户打开的那个串口号
                            
                        }
                        else
                        {
                            cbx_commNo.SelectedIndex = cbx_commNo.Items.Count > 0 ? 0 : -1;//显示获取的第一个串口号
                        }
                        COM_Closing = false;
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);  //异常处理函数
            }
            base.WndProc(ref m);

加入上述代码后,能够检测出串口已经拨出的情况!
但是拔出后,会出现弹框“对窗口的访问被拒绝”,通过对可能出现异常的控件部分加入

try{
}
  catch (Exception ex)
            {
                MessageBox.Show(ex.Message);  //异常处理函数
                return;
            }

并设置相关断点,定位到在定时发送数据的过程中,出现了弹框的问题,所以我把MessageBox.Show(ex.Message)这个函数注释掉以后,就解决了这个问题!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值