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转串口的拔插捕获所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)