Posts /

C# 监听串口插拔事件

30 May 2019

C# 监听串口插拔事件


场景简述

​ 在进行C#串口开发时,往往需要对可访问的串口通过ComboList组件进行呈现共用户进行选择软件需要连接的串口,在这过程中就需要对串口的插拔事件进行监听。当事件到来对列表、串口开关进行对应的变化。使得整个软件操作起来更加合理。

方法介绍

  1. 在WPF中,每一个窗口都拥有一个Loaded事件传入接口,可以将函数传入该接口(即把函数委托给Loaded事件)。Loaded事件在元素即将要被渲染时触发。

  2. 在Loaded时定义拦截Windows消息拦截事件。事件函数(DeviceChanged)被委托给HwndSource的Hook。

  3. 在DeviceChanged函数中过滤串口插拔事件,并执行串口插拔后需要完善的逻辑操作。

    1. 事件序号:0x219 移动设备改变事件。0x8000设备插入事件。0x8004设备拔出事件。

具体实现

> 
> public MainWindow()
> {
>     Loaded+=MainWindow_Loaded;
> }
> 
> void MainWindow_Loaded(object sender,RoutedEventArgs e)
> {
>     HwndSource hwndSource = PresentationSource.FromVisual(this) as HwndSource;
>     if(null!=hwndSource)
>     	hwndSource.AddHook(new HwndSourceHook(DevieceChanged));
> }
> 
> private IntPtr DeviceChanged(IntPtr hwnd,int msg,IntPtr wParam,IntPtr lParam,ref bool handled)
> {
>     string[] PortNames;
>     if (msg == WM_DEVICECHANGE)
>     {
>         switch (wParam.ToInt32())
>         {
>             case DBT_DEVICEARRIVAL://设备插入  
>                 PortNames = SerialPort.GetPortNames();
>                 if (IsWorking == true && PortNames.Contains(ConfigInfo.Port))
>                 {
>                     if (serialPortUtil != null)
>                     {
>                         serialPortUtil.OpenPort();
>                         MsgBox.Show("串口连接成功!");
>                     }
>                 }
>                 break;
>             case DBT_DEVICEREMOVECOMPLETE: //设备卸载
>                 PortNames = SerialPort.GetPortNames();  
>                 if (IsWorking == true && !PortNames.Contains(ConfigInfo.Port))
>                 {
>                     MsgBox.Show("串口连接断开!");
>                 }
>                 break;
>             default:
>                 break;
>         }
>     }
>     return IntPtr.Zero; 
> }
> ```
>
> 

通过该方法可以实现对串口插拔事件的监听。

参考文献

C# WPF USB 串口插入拔出识别监测