打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C#中USB转串口的拔插捕获(原)

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

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

        // usb消息定义
        public const int WM_DEVICE_CHANGE = 0x219;
        public const int DBT_DEVICEARRIVAL = 0x8000;

最近一个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);
        }

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
C#的usb通讯编程
虚拟机Linux(Fedora10)下USB转串口的使用, minicom: cannot...
delphi USB 拨出 插入
c# 如何在winform中模拟鼠标点击事件
avr单片机 串口实现printf(使用变参函数)
传感网原理与技术
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服