加入收藏 | 设为首页 | 会员中心 | 我要投稿 北几岛 (https://www.beijidao.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

C#中USB转串口的拔插捕获

发布时间:2021-05-20 14:33:42 所属栏目:大数据 来源: https://blog.csdn.net/kasama1
导读:2012-11-28 23:15:44 |??分类: ?项目心得? |??标签: c#??usb转串口?? | 举报 | 字号 ? 订阅 ? ? ? ? ??下载LOFTER 我的照片书??| C#中USB转串口的拔插捕获 最近一个C#项目用户要求能够实现插入USB接口,自动识别所接入的串口,而无需人工去选择插入的是那

2012-11-28 23:15:44|??分类:?项目心得?|??标签:c#??usb转串口??|举报|字号?订阅

? ? ? ?

??下载LOFTER 我的照片书??|

C#中USB转串口的拔插捕获

最近一个C#项目用户要求能够实现插入USB接口,自动识别所接入的串口,而无需人工去选择插入的是那个串口。通过一阵子的资料搜罗,总算找到一个最佳的实现方案。以前是通过线程循环逐个打开串口,发送握手包来确认接入的是那个串口,这么做能实现,不过会产生通信的数据包信息。现在,采用windows的消息机制来捕获插入的usb状态,然后,获取对应的串口名称。代码如下:

??????? // usb消息定义
??????? public const int WM_DEVICE_CHANGE = 0x219;
??????? public const int DBT_DEVICEARRIVAL = 0x8000;
??????? public const int DBT_DEVICE_REMOVE_COMPLETE = 0x8004;
??????? public const UInt32 DBT_DEVTYP_PORT = 0x00000003;

??????? [StructLayout(LayoutKind.Sequential)]
??????? struct DEV_BROADCAST_HDR
??????? {
??????????? public UInt32 dbch_size;
??????????? public UInt32 dbch_devicetype;
??????????? public UInt32 dbch_reserved;
??????? }

?????? ?[StructLayout(LayoutKind.Sequential)]????????
??????? protected struct DEV_BROADCAST_PORT_Fixed
??????? {
??????????? public uint dbcp_size;
??????????? public uint dbcp_devicetype;
??????????? public uint dbcp_reserved;
??????????? // Variable?length field dbcp_name is declared here in the C header file.
??????? }

??????? /// <summary>
??????? /// 检测USB串口的拔插
??????? /// </summary>
??????? /// <param name="m"></param>
??????? protected override void WndProc(ref Message m)
??????? {
??????????? if (m.Msg == WM_DEVICE_CHANGE)??????? // 捕获USB设备的拔出消息WM_DEVICECHANGE
??????????? {
????????????????switch (m.WParam.ToInt32())
??????????????? {
???????????????????case DBT_DEVICE_REMOVE_COMPLETE:??? // USB拔出????????????????????????
????????????????????????????break;
??????????????????? case DBT_DEVICEARRIVAL:???????????? // USB插入获取对应串口名称
??????????????????????????? DEV_BROADCAST_HDR dbhdr = (DEV_BROADCAST_HDR)Marshal.PtrToStructure(m.LParam,typeof(DEV_BROADCAST_HDR));
??????????????????????? if (dbhdr.dbch_devicetype == DBT_DEVTYP_PORT)? {
??????????????????????????? string portName = Marshal.PtrToStringUni((IntPtr)(m.LParam.ToInt32() +Marshal.SizeOf(typeof(DEV_BROADCAST_PORT_Fixed))));
??????????????????????????? Console.WriteLine("Port '" + portName + "' arrived.");
??????????????????????? }????????????????????????
??????????????????? break;
??????????????? }????????????????
??????????? }
??????????? base.WndProc(ref m);
??????? }

(编辑:北几岛)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读