![e6136720349a939e0d9908823b6dd489.png](https://i-blog.csdnimg.cn/blog_migrate/b0ce06d959f2538e19717eb0e4125fb7.jpeg)
windows
在前文C#程序与单片机通信时,如何自动初始化串口(1)?中介绍了如何注册程序,使用程序能够监听USB插、拔事件。当程序获得这些事件之后,如何确定事件源就是我们关注的那个USB设备呢?
![eb856886b01c335e0ceed853c6a16b35.png](https://i-blog.csdnimg.cn/blog_migrate/e5c0de8b64f02cabb6345016b9f69e03.jpeg)
USB PID信息
每个USB设备都有他们的生产厂家代码、设备代码等信息,我们可以利用此信息来确定该设备。比如,有一个设备代码如下的USB设备(USB虚拟串口),此值可以从Windows设备管理>USB驱动信息中获取。
Device USBVID_0483&PID_5740123456
//定义一个标识字符串const string VID_STR = @"USBVID_0483&PID_5740";
在前文的Usb_DeviceAdded()函数中,要从系统中获得USB设备信息,并打开相应的串口。C#中要用到System.Management(类似系统设备管理功能),采用命令的方式实现,如下
//搜索所有插拔设备ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * From Win32_PnPEntity");//逐个访问foreach (ManagementObject mo in searcher.Get()){ //比较是否正确 if (0== string.Compare(VID_STR, 0, mo["PNPDeviceID"].ToString(), 0, VID_LEN)) { try { //找到对应设备 m_Port = new SerialPort(mo["DeviceID"].ToString(), 115200, Parity.None, 8, StopBits.One) { //缓冲区大小 WriteBufferSize = 1024, ReadBufferSize = 1024, //超时设定 ReadTimeout = 2000//ms }; //打开串口 m_Port.Open(); IsOpen = m_Port.IsOpen; } catch { m_Port.Dispose(); //如果失败则提示 throw new ArgumentNullException("Port Open Failed