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); ??????? } (编辑:北几岛)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|