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

from:http://majun2k.blog.163.com/blog/static/417568522012102811105766/


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);
        }
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值