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

C#中USB转串口的拔插捕获,第1张

概述2012-11-28 23:15:44|  分类: 项目心得 |  标签:c#  usb转串口  |举报|字号 订阅      下载LOFTER我的照片书  |C#中USB转串口的拔插捕获最近一个C#项目用户要求能够实现插入USB接口,自动

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

@H_419_31@        

  下载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);
        }

总结

以上是内存溢出为你收集整理的C#中USB转串口的拔插捕获全部内容,希望文章能够帮你解决C#中USB转串口的拔插捕获所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1212991.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存