主要参考如下:下面这里也给出了串口助手开发的相关过程和USB热拔插检测相关。
测验代码部分如下:
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)这个函数注释掉以后,就解决了这个问题!!