当前位置: 首页 > news >正文

WPF实现串口热插拔 (提供百度网盘源代码)

为什么实现串口热插拔:

        在工业控制、仪器连接等上位机应用场景中,USB串口设备的实时插拔检测是一个常见需求。当设备被意外拔除或重新插入时,应用程序需要立即响应,更新界面状态或执行相应的处理逻辑。

        很多人首先会想到使用轮询方式:定期扫描系统串口列表来检测变化。这种方法虽然实现简单,但存在明显缺陷:检测不及时、系统资源浪费,且在频繁插拔设备时可能导致界面卡顿。

        实际上,Windows系统本身提供了一套完善的设备消息通知机制。通过监听系统广播的WM_DEVICECHANGE消息,我们能够实时获知USB串口设备的插入和移除事件,从而实现真正的高效热插拔检测。

我将基于WPF框架,分享一个完整的串口热插拔检测实现方案。

实际的效果:

主要代码:

程序执行步骤:

        主窗体加载时会调用Window_Loaded,这个函数添加了Windows消息处理的钩子函数,Windows有消息时会调用这个钩子函数,然后进一步判断是否是设备发生了变化,是的话再去判断是插入还是拔出,再去更新串口列表。


namespace MySerialPort
{/// <summary>/// Interaction logic for MainWindow.xaml/// </summary>public partial class MainWindow : Window{public string[] PortNames;public const int WM_DEVICECHANGE = 0x219;          //设备改变消息编号public const int DBT_DEVICEARRIVAL = 0x8000;       //设备插入消息编号public const int DBT_DEVICEREMOVECOMPLETE = 0x8004; //设备移除完成消息编号private SerialPort serialPort;public MainWindow(){InitializeComponent();}/// <summary>/// 主窗体加载事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Window_Loaded(object sender, RoutedEventArgs e){HwndSource? hwndSource = PresentationSource.FromVisual(this) as HwndSource;if (hwndSource != null){hwndSource.AddHook(new HwndSourceHook(WindowEventHandler));PortNames = SerialPort.GetPortNames();UpdateSerialPort(PortNames);}}/// <summary>/// 串口插拔检测/// </summary>/// <param name="hwnd"></param>/// <param name="msg"></param>/// <param name="wParam"></param>/// <param name="lParam"></param>/// <param name="handled"></param>/// <returns></returns>private IntPtr WindowEventHandler(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled){if (msg == WM_DEVICECHANGE){switch (wParam.ToInt32()){case DBT_DEVICEARRIVAL://设备插入  PortNames = SerialPort.GetPortNames();Debug.WriteLine("有串口插入!");UpdateSerialPort(PortNames);break;case DBT_DEVICEREMOVECOMPLETE: //设备拔出完成PortNames = SerialPort.GetPortNames();Debug.WriteLine("有串口拔出!");UpdateSerialPort(PortNames);break;default:break;}}return IntPtr.Zero;}/// <summary>/// 串口列表更新/// </summary>/// <param name="PortNames"></param>public void UpdateSerialPort(string[] PortNames){CMBPort.Items.Clear();for (int i = 0; i < PortNames.Length; i++){CMBPort.Items.Add(PortNames[i]);}}}
}

源代码链接:
通过网盘分享的文件:MySerialPort_2.zip
链接: https://pan.baidu.com/s/1KwZ8aBwel174yLOd8X7M_Q?pwd=xcgh 提取码: xcgh 
 

http://www.dtcms.com/a/434825.html

相关文章:

  • 企业网站关键词排名南京比较好的网络策划公司
  • FFmpeg 核心 API 系列:avcodec_find_decoder / avcodec_alloc_context3 / avcodec_open2
  • 文件上传简单的绕过总结
  • Visual Studio Code中launch.json深度解析:C++调试的艺术
  • 天长市建设局网站惠来做网站
  • 51单片机红外遥控
  • Java 集合 “List + Set”面试清单(含超通俗生活案例与深度理解)
  • 云南网站建设哪个好软文广告平台
  • 《嵌入式 – GD32开发实战指南(RISC-V版本)》第8章 PWM输出实现
  • HNU 编译系统 第一次作业
  • 网站怎么做交易平台图片生成网页链接在线
  • 渗透测试中的信息收集:文档元数据
  • minikube 的 kubernetes 入门教程-kubeSphere
  • 深圳 手机网站建设彩妆做推广的网站
  • 网站跳转是什么意思郑州建站网站的公司
  • 老题新解|再求 f(x,n)
  • 【Android cmd命令的执行流程】
  • c++26新功能—constexpr在稳定排序中的应用
  • AI生成悬疑故事
  • 泰山派rk3566烧录
  • Phpstudy博客网站apache2日志分析python代码
  • asp网站程序优点做App和网站 聚马
  • 免费软件下载网站入口正能量微信开发公众平台
  • 【系统重装】Windows无法安装到这个磁盘提示选中的磁盘具有MBR分区表解决方法(亲测有效)
  • MySQL 查询与更新语句执行过程深度解析:从原理到实践​
  • Bella Beauty – Aesthetic Medical Clinic WordPress Theme: A Practical
  • 洗车店会员管理系统数据分析
  • 门户网站的意思wordpress 导航 防刷新
  • 虚幻基础:角色受击
  • unordered_set 与unordered_multiset?我们该如何选择